Guild icon
swift-developers-japan
archived / beginner-help_archived
初心者が質問をして誰かが助ける部屋 質問テンプレ [発生環境] Xcode 13.5 iOS 15.5 iPhone 13 Pro Simulator [解決したい問題] xxxが表示されない xxxが表示されるようにしたい [発生手順] 1. Aボタンをタップする 2. Bボタンをタップする [コード] コードを見せても問題ない人はリンクは貼ったり、記述したり 最小限で発生するコードだと尚望ましい
Avatar
ぼっちなう
Avatar
Deleted User 3/14/2017 2:17 PM
🤔
Avatar
Deleted User 3/14/2017 3:43 PM
🐶
Avatar
Deleted User 3/16/2017 2:23 AM
Avatar
🐍
🐳 1
Avatar
☔
🌈 1
Avatar
Deleted User 3/26/2017 7:58 AM
🐤
🐔 1
Avatar
beginner 🤗
Avatar
😽
😇 2
Avatar
omochimetaru 4/27/2017 4:04 AM
ちょっと趣旨変えてみた
👍 1
😀 1
Avatar
今UIWebviewを敢えて使うメリットって何かありますかね?単純に疑問に、思ったんですけど
Avatar
omochimetaru 4/27/2017 4:16 AM
UIWebView / WKWebView / SFSafariViewController の選択肢があるんだっけ。
Avatar
僕の専門だ
4:16 AM
お答えします。
👀 4
😆 1
4:17 AM
SFSafariViewController、こいつは要はSafariです。SafariExtensionsが使える他、Safariとクッキーキャッシュ共有している、プロセスも別という優れもの。
4:18 AM
しかし、任意のJavaScriptを実行できない、一度インスタンスを生成したら外からURLを差し込めないなど
4:18 AM
カスタマイズ性に乏しい。
4:19 AM
次WKWebView、こいつはJavaScriptが速いWebViewです(雑) APIも比較的ナウな感じでヤングなんですが、幾つかの機能(JavaScriptからTextAreaをアクティブにしてOKのプロパティ)が未実装だったり、通信フックができないのでProxy指したりアレヤコレヤは出来ません。
4:19 AM
なので
4:20 AM
纏めると、UIWebViewを使うメリット、通信フックしたい、JavaScriptからTextAreaをアクティブにしたい、等の、穿った需要がある場合に使います。どうしようもないから。
😯 2
😲 5
💯 1
Avatar
なるほど。 普通に使うぶんには使うことなさそうですねー。 ありがとうございます‼️ 🤗
😁 1
Avatar
Interface Builderで未だWKWebViewがない理由って何かあるんですか🙄
Avatar
import WebKitが必要だからだと思いますよ
Avatar
あー…Interface BuilderはUIKitで扱えるものだけなんですねー…。 なるほろ…
Avatar
あれ?GLKViewとか普通にあるな
4:52 AM
なんでだろ
Avatar
omochimetaru 4/27/2017 4:53 AM
SpriteKitのSKViewとかも置けるんだっけ
Avatar
designated initializer に以降変更不可の configuration 渡さなきゃいけないからだと思ってた。
💡 2
👏 1
Avatar
キーボードの上にToolbarを表示しようとしているんですが、IMEの予測補完周りの挙動がおかしくて困っています
8:23 AM
通常時は
8:23 AM
8:23 AM
こうなるのですが
8:24 AM
予測変換が消えると予測変換のスペース分下に下がらなかったり
8:24 AM
予測変換が消えた後予測変換がもう一回出ると
8:24 AM
8:24 AM
このように予測変換に隠れてしまったりして困っています
Avatar
UITextViewのinputAccessoryViewにUIToolbarを入れてやると良いですよ
Avatar
Notification.Name.UIKeyboardWillChangeFrame これが足りてないですね。
Avatar
UITextViewのinputAccessoryViewに何も考えずにUIToolBarを入れたらクラッシュしてしまいました(親viewを変えないといけない?) Notification.Name.UIKeyboardWillChangeFrameを足しても変わらないですね... コールバックはUIKeyboardWillShowと同じにしてますが、これがいけないんでしょうか
Avatar
うーん、ぱっと見ただけだとよくわからない、
8:46 AM
えっと、notification.userInfoの中にアニメーションの指定があるはずなので、それは参照した方が良いです
8:48 AM
もう一つ、keyboardのrectは、画面に対する相対位置になっているので、heightは見た目の高さと必ず等しくなるわけでは無いです
8:48 AM
でもこの2つは今の問題とは直接関係なさそう
8:53 AM
UIKeyboardFrameBeginUserInfoKey
8:53 AM
これ、変化前の高さですね
8:53 AM
UIKeyboardFrameEndUserInfoKeyがあるはず
Avatar
あ、動きました
8:55 AM
ありがとうございます!
😁 2
Avatar
普段はStoryboardを使わずにコードでアプリを開発しているのですが、Storyboardも使いこなさないといけないと思い今回はStoryboardで開発しています。そこでStoryboard上でのローカライズの質問なんですが、UILabelのAttributedTextがstringsでローカライズされないことに悩んでまして、これはコード上で解決するしかないのでしょうか?
Avatar
omochimetaru 4/30/2017 4:43 AM
無いと思っています・・・ ストーリーボード自体をローカライズできるけど、それやるとビュー自体を共通に保つのが大変すぎるし 方法があれば知りたい
Avatar
返信ありがとうございます。やっぱりそうですか。
4:47 AM
となると、viewDidLoadなりで、textやtitleに文字列を入れるときにNSLocalizedStringでローカライズするのがいいのかな。
4:47 AM
悩ましい。
Avatar
swiftなら、@IBOutletのdidSetに書くのが良いですね
4:49 AM
StoryboardにIBInspectableとか使って機能追加するのも出来るんですが、コード側でやった方が楽だなと言う印象があります。
Avatar
なるほど、ありがとうございます
Avatar
こんな感じでやれば出来ましたので一応共有
Avatar
NSLocalizedStringの引数のCommentの必要性が未だわからないです😩
Avatar
omochimetaru 4/30/2017 6:15 AM
""にしてる
Avatar
ですよね〜defaultで""にしていてほしい・・・
Avatar
omochimetaru 4/30/2017 6:25 AM
自分で func LSTR()を定義するとか?
Avatar
やはりそれですねー
Avatar
NSLocalizedString、素で使うの辛すぎてSwiftGenに頼ってます
Avatar
omochimetaru 4/30/2017 6:37 AM

SwiftGen とは

SwiftGen は、iOS / macOS アプリ開発の補助ツールです。リソース(アプリ内の画像やテキストなど)の扱...
6:37 AM
リソース定義をコードにしてくれるやつか
Avatar
ほぉ〜いいですね
Avatar
Safariの<input type="file">をタップすると出てくるファイルソースアプリ(?)一覧ってWebkit使わず出せますか?
10:15 AM
これです
🤔 2
Avatar
omochimetaru 5/1/2017 4:17 AM
iOSでリソースに静的型付けする系のプリプロセッサってどれがいいんですか? とりあえずSwiftGenとR.swiftが人気なのかなと思っていますが https://github.com/SwiftGen/SwiftGen https://github.com/mac-cain13/R.swift
SwiftGen - The Swift code generator for your assets, storyboards, Localizable.strings, … — Get rid of all String-based APIs!
R.swift - Get strong typed, autocompleted resources like images, fonts and segues in Swift projects
Avatar
R.swiftは、全部Rから始まるのがなんか微妙ですねー。なので個人的にはSwiftGen一択になりそう・・・ (edited)
3:54 PM
Pods嫌いな自分としては、Carthageに対応して欲しいです😭
Avatar
@tarunon これですね、ありがとうございます!
Avatar
@ありぜ ( SwiftGen については知りませんが普通は)Carthage 対応は簡単なんで、 fork して対応しちゃうといいかもですね。依存ライブラリが Carthage 対応してないと面倒ですが・・・。
Avatar
@koher そうなんですねー。ありがとうございます。試してみます。
Avatar
↓です。 "Archive prebuilt frameworks into one zip file" と "Declare your compatibility" はやらなくてもいいですし、タグもつけなくても Carthage でブランチ直指定できるので、依存ライブラリがなければ実質 Xcode で scheme の Shared にチェックを入れるだけですね。 https://github.com/Carthage/Carthage/blob/master/README.md#supporting-carthage-for-your-framework
Carthage - A simple, decentralized dependency manager for Cocoa
Avatar
swiftgenのcocoapodsって
4:57 AM
コードじゃなくてバイナリが降ってきてますよね、carthageでその仕組み出来るのかな
Avatar
"Archive prebuilt frameworks into one zip file" をやればできますね。
4:58 AM
ただ、僕は SwiftGen を使ってないので、あくまで Carthage 一般論のことしかわかりません。
Avatar
swift testで走らせないテストの指定ってできないですか? Xcodeだとdisableできるので重宝するのですが
Avatar
僕は知らないですが、 swift package generate-xcodeproj して Xcode 上で実行はダメですか?
Avatar
基本はそっちなんですがswift testもやらないで良いわけじゃないですよね? パフォーマンステスト等機能に直結しないものは走らせたくないという状況です。
Avatar
うーん、パフォーマンステストも走るのが正しい状態なんじゃないでしょうか?何かミスって計算量がおかしくなってて組み合わせ爆発したりするとダメなわけですし。
Avatar
機能改修によるパフォーマンスの向上を測るために設置してるので計算量的な問題は考えてないんですよね。
9:41 AM
とりあえずはswift testを極力しないという方針で回避が良いか。
Avatar
#if とかでできないかな?
Avatar
norio_nomura 5/2/2017 9:43 AM
一時的に走らせない?それとも SwiftPM では常に走らせない?
Avatar
常にですね
Avatar
norio_nomura 5/2/2017 9:44 AM
ならばテストメソッド定義自体を #if !SWIFT_PACKAGE で囲ってしまうのが良いのでは。 (edited)
👍 1
Avatar
お、それは良さそうですね
9:45 AM
SWIFT_PACKAGEの存在自体知らなかったです。
Avatar
norio_nomura 5/2/2017 9:46 AM
generate-xcodeproj で生成されたプロジェクトには何故か SWIFT_PACKAGE 定義が含まれているので、それを消した方が良いです。
Avatar
いいかんじになりました。ありがとうございます。
🙂 1
Avatar
omochimetaru 5/2/2017 12:09 PM
@ありぜ なるほど〜ありがとうございます
😀 1
Avatar

これはなに

  • 独自の拡張メソッドを認識しやすく、かつ名前が被らないようにするため、ex をもつプロトコロルを作成してそれに準拠させるという実装スタイルがある
  • その実装をするときにハマったので共有
# モダンなSwif...
12:34 PM
こんな記事書いたのですが、原因がよく分かっておらず、もし詳しく分かる方がいたら嬉しい
Avatar
norio_nomura 5/20/2017 1:22 PM
@sutokuro NonError_1_Contents.swiftNonError_2_Contents.swiftassociatedtype CompatibleTypeassociatedtype CompatibleTyp になっていますよ。
1:23 PM
でtypoを直すとError_Contents.swiftと同じ状態になります。
Avatar
なんと、ありがとうございます
3:38 PM
確かに、NonError_1_Contents.swiftはtypoを直すと、Error_Contents.swiftと同じエラーになりました
3:38 PM
NonError_2_Contents.swift はtypoを直すと正常に動作しました。
Avatar
Error_Contents.swift において、 extension String: ACompatible { } から推測される String. associatedtype の型はAExample<Self> extension String: BCompatible { }から推測される String. associatedtype の型はBExample<Self> で、型が一致していないのでエラーになりますね。 (edited)
11:46 PM
Playgroundのコンソール Playground execution failed: error: 20170520-221301.xcplaygroundpage:42:1: error: type 'String' does not conform to protocol 'BCompatible' extension String: BCompatible { } // ここで error: type 'String' does not conform to protocol 'BCompatible' が出る 20170520-221301.xcplaygroundpage:24:9: note: protocol requires property 'bEx' with type 'String.CompatibleType' (aka 'AExample<String>'); do you want to add a stub? var bEx: CompatibleType { get } ^ 20170520-221301.xcplaygroundpage:36:9: note: candidate has non-matching type 'BExample<Self>' [with CompatibleType = String.CompatibleType] var bEx: BExample<Self> { ^
Avatar
ありがとうございます。エラーの意味は理解できました。まだちょっと自分のなかで腑に落ちない部分が残っていますが、いったん置いておきます。
5:19 AM
ありがとうございました。
Avatar
今更見たんですが、SwiftGenのCarthage対応というのはナンセンスというかできないですね。tarunonさんが言っているようにCocoaPodsではCLIツールのバイナリを配布してて、Carthageが対応してるのはあくまでビルド済みのframeworkのバイナリなので、CLIツール用の仕組みではないです。
12:26 PM
なんかそういうissueが上がってるのを見た気がする。
Avatar
SwiftLintだけどこんなの https://github.com/realm/SwiftLint/issues/1481
Goals I would like to install a specific version of Swiftlint as a dependency to my iOS project using Carthage. Currently, this works perfectly with Cocoapods: pod 'SwiftLint', '0.18.1' As result, ...
12:52 PM
CocoaPodsやらBundlerやらnpmとか考えれば機能としてはおかしくはなさそう
12:53 PM
けどそこまでやるリソースはないのが現状
Avatar
SwiftPM対応すれば https://github.com/vknabel/Rock とか https://github.com/JohnSundell/Marathon こんなのもある
With Rock you can easily install CLIs built with Swift Package Manager.
Marathon makes it easy to write, run and manage your Swift scripts 🏃
Avatar
やっぱSwiftGenのCarthage対応むりなんですねぇ・・🙄残念
Avatar
Kotlin派からこれできないのかと質問を投げかけられ、確かにできないぐぬぬとなりました class Digest { let str: String init() { str = makeString() } private func makeString() -> String { return "hoge" } } error: use of 'self' in method call 'makeString' before all stored properties are initialized
Avatar
これは出来ないほうが安全です
8:04 AM
あーprivateか
Avatar
ただ、 private とはいえ、そこから public 呼べますからね。
Avatar
ですね
Avatar
仰る通りでまずこの使い方が微妙なのはありつつも
Avatar
funcは全てのフィールドと全てのfuncにアクセス可能
8:05 AM
そもそもそのfuncはinstance methodである必要が無いので
8:05 AM
staticで宣言したほうが良さそう
Avatar
omochimetaru 5/26/2017 8:06 AM

kotlinで本物のヌルポを出す方法

kotlinではnull安全ですからヌルポとは出会えません。でも、kotlinのnull安全機構においてクラッシュするケースがあります。 !! 演算子で明示的にクラッシュケースを書いた場...
👍 1
8:06 AM
これなげつけといて
Avatar
Kotlin版 class Digest() { val str: String init { str = makeString() } private fun makeString(): String { return "hoge" } }
Avatar
代理戦争で草
Avatar
omochimetaru 5/26/2017 8:08 AM
僕もはじめKotlinの経験があったんで、swiftの仕様はつらいなあと思ったんですけど、詳しく調べてみたら、それが原因でkotlinはヌルセーフじゃなくなってたんです
8:08 AM
今はSwiftのほうがマシだと思っています
Avatar
initとstatic funcの中では、static funcが型省略して書けるようになれば
8:09 AM
まあ良さそう、でもinitは完了後と完了前とで意味が変わってくるのは微妙かなー
8:10 AM
static funcはそもそも省略可能だった
Avatar
僕、最近 Kotlin の人化してますけどねw < 代理戦争で草
Avatar
omochimetaru 5/26/2017 8:10 AM
さりげなくdisりつつ解説しているので良い感じ @koher
Avatar
トロイの木馬じゃないか
Avatar
omochimetaru 5/26/2017 8:11 AM
www
Avatar
誠実であろう
Avatar
そんな dis ってたかな。検査例外がないのとか?
Avatar
omochimetaru 5/26/2017 8:12 AM
僕は、この点については List を実装した ImmutableList クラスを別に作って、 Scala のように厳密に区別すべきだったと思います。
8:12 AM
僕は、検査例外に関してはこちらのような考えなので、検査例外をなくしてしまったこと Kotlin の言語仕様の中で一番イケてないところだと考えています。
8:13 AM
前者は Scala 方式もまだイマイチで、 letvar でゼロコストでミュータビリティを変えられる Swift 最強
Avatar
omochimetaru 5/26/2017 8:13 AM
ですね
Avatar
let var, 一番最初のArray壊れてたときはどうなるかと思ったけどめちゃくちゃ良くなってるの感慨深い
Avatar
最初の壊れ方はひどかったですね。
Avatar
関数型界隈からすごい突っ込まれてましたね
Avatar
omochimetaru 5/26/2017 8:18 AM
その関数型界隈からのツッコミというのは知らなかったです これの事かと思った http://qiita.com/koher/items/6f54eafac59793e7c364
(2015.11.18に追記) __「Swift List」 で検索するとこの投稿にたどり着いてしまいますが、関数型言語でいうところのリストをお求めの方は ["Swiftでhead、tailにパターンマッチできる遅延リスト"]...
Avatar
あったなあ…
Avatar
昔の投稿が晒されると恥ずかしい・・・
Avatar
omochimetaru 5/26/2017 8:20 AM
冒頭でもう治ったって書いてあるしまあ
Avatar
以下の、Appleが最近発表したSwiftという言語の、面白い(?)仕様が話題になってますが、 twitter:476310789..
開発者アカウントに金が出せない貧乏人の方々が、次の Apple の Swift のコードの挙動がわからない、という..
Avatar
omochimetaru 5/26/2017 8:22 AM
古いパラダイムだなw
8:23 AM
8:23 AM
let a = [1,2] // a = [1,2] var b = a; // b = [1,2] b[1] = 3; // a = [1,3] b = [1,3] b.append(5); // a = [1,3] b = [1,3,5] b[1] = 4; // a = [1,3] b = [1,4,5]
8:23 AM
これは完全に壊れてたやつだ
Avatar
www
Avatar
omochimetaru 5/26/2017 8:23 AM
Avatar
Swift でもできた! class Digest { let str: String init(item: Digest) { str = item.makeString() } func makeString() -> String { return "test" } convenience init() { self.init(item: self) } } print(Digest().str) 完全にだめなやつw
Avatar
ンヒィ
Avatar
omochimetaru 5/26/2017 8:25 AM
んごwww
Avatar
おもちくん待望の本物のぬるぽかな?
Avatar
omochimetaru 5/26/2017 8:25 AM
お、これ利用すればヌルセーフ破壊dけいそう
8:25 AM
きたか
Avatar
ぜんぜんいけますよw
Avatar
omochimetaru 5/26/2017 8:25 AM
ヌルポじゃないよ、Swiftはunmanagedだから EXC_BAD_ACCESSが来るぞ
Avatar
画面越しに超喜んでるのが想像出来て草
Avatar
omochimetaru 5/26/2017 8:26 AM
www
Avatar
すごい、↓こんなの思いつかないw convenience init() { self.init(item: self) }
Avatar
self.initselfが渡せるのがもうおかしい気が
Avatar
それ通っちゃうんか...
Avatar
omochimetaru 5/26/2017 8:26 AM
この前のvar self書き換えに通じるテクニックですね
Avatar
バグですねー
Avatar
class Digest { let str: String let hello: String init(item: Digest) { str = item.makeString() hello = "test" } func makeString() -> String { return hello } convenience init() { self.init(item: self) } } print(Digest().str) // "" <- ?
8:26 AM
ん?
8:27 AM
Stringは、あれかw
8:27 AM
真にnullだったら""に化ける
8:27 AM
@ezura がこの辺は詳しかったはず
8:32 AM
できた。
8:33 AM
多分Stringの場合はそれ自体が値型で、メモリはゼロクリアされているんで、内部バッファへのポインタがnilとかサイズとか0とかいろいろ、ゼロ値でうまくうごく
8:33 AM
参照型のフィールドを初期化済み扱いで受け取れば壊せる
Avatar
オレオレStructでも落ちた Foo() 1(75709,0x70000aac2000) malloc: *** error for object 0x6180000129ec: Invalid pointer dequeued from free list *** set a breakpoint in malloc_error_break to debug
8:33 AM
見たことのないエラーだw
Avatar
omochimetaru 5/26/2017 8:33 AM
やばそうw
Avatar
not nullsafe より null unsafe の方がいいかも
Avatar
omochimetaru 5/26/2017 8:34 AM
かえといた
Avatar
Foo()はnilからうまいこと推測されて出てきたは良いものの、その後の諸々でぶっ壊れてる
8:40 AM
この間の @rintaro  のself書き換えでNib/Stroyboardのinstantiateが書けたけど
8:40 AM
やっぱりpropertyとしてletを置けないので価値はそこまで高くない感じ
8:40 AM
こうなる
Avatar
やばい、チャネルの内容が #beginner-help_archived じゃなくていつもの #swift モードになってるw
Avatar
あっ
Avatar
omochimetaru 5/26/2017 8:40 AM
あ、まちがえた
Avatar
#swiftじゃなかった
8:41 AM
気がついてなかった、すみません
Avatar
話が弾んじゃいましたねw
Avatar
では話題を戻して モダンなSwiftのExtension ですけど、 UIColor.hogeview.backgroundColor = .hoge できるけど UIColor.ex.hogeview.backgroundColor = .ex.hoge できないってどうなんですかね?
Avatar
omochimetaru 5/26/2017 6:24 PM
そのパターンって 1段しか推論できないんですっけ
6:25 PM
左辺値の型に対して探索する事は決まってるはずだから、右辺の式が多段になっててもできていい気がする(言語仕様の改善として
6:25 PM
両辺が不定のまま推論でガッチャンコするようなパターンもあるんだろうか、あまり書かなくてわからない
Avatar
それ#beginner-help_archivedの話題でいいの?
Avatar
むむ どこまでbigginerなのか悩ましいですね
Avatar
omochimetaru 5/27/2017 8:40 AM
質問する人が「広く答えが知られた問題であろうが自分が詳しくないためわからない」と感じるのが初心者質問のイメージ。
8:42 AM
ただ、本人がそう思っていても、高度なトピックだと思われる場合、そういうのが頻発すると、本当の初心者にとっては「ここは自分のような本当の初心者が発言するには場違いだ」と萎縮してしまうのは本意ではないので
8:42 AM
回答しようとした時に回答者がチャンネルを移動するのが良いかも?
8:43 AM
他にも、UIKitチャンネルとか、内容に即したチャンネルに移動するなり。
8:43 AM
ちょっとしたことでも以外とピンポイントだと知らない人も多かったりすることがあるんでトピックチャンネルのほうが知見が集約できて良いと思います
8:45 AM
話題を投稿する時点で「どこが適切だろう?」というのを気にしすぎてめんどくさくなるのは残念なので、まあ気軽に書き込んでもらって、
8:45 AM
回答する人が交通整理していくのが良さそう。
👍 5
Avatar
func mockFetch() -> Observable<Bool> { return Observable.create { observer in observer.on(.next(true)) observer.on(.completed) return Disposables.create() } }
2:41 AM
mockFetch().subscribe(onNext: { _ in print("done") }).disposed(by: disposeBag)
2:41 AM
↑の返り値が必要ない時に使えるSubject?とかコードの書き方とかってあるのでしょうか?
Avatar
返り値はこの場合何を指してますか?
Avatar
終了したことを教えたいだけです
2:44 AM
Emits zero elements Emits a completion event, or an error Doesn't share side effects
2:44 AM
CompletableならNext0個で、.subscribe(onComplete: {}) で拾うという手があるかも?
Avatar
もともとのモチベーションがcompletionHandlerをRxで書き換えたいという感じです
Avatar
completeが欲しいだけなら、ignoreElementsが使えそう
Avatar
ありがとうございますm( )m
Avatar
omochimetaru 5/29/2017 2:45 AM
それならSingleのほうが良い気も?Nextの型パラは <Void> にして気にしないとか
Avatar
たしかに、Voidで大丈夫ですね、、、
Avatar
今はcompleteだけで良いかもしれないけど、他でそうかという問題があるので、
2:47 AM
Single<Bool>にして値は適当に無視するのが良さそう。
👌 1
2:48 AM
さっきのmockみたいにnext, completeしたいだけなら create で書かずに .just でもかけますよ。下請けに本当の非同期処理がある場合は create ですね
Avatar
了解です!
Avatar
cocoapods(1.2.1)を使って開発してるんですが、写真のエラー出てしまい、解決できなくて困ってます。このエラーに出会った方とかいらっしゃいますか?再起動とかpod install とか Podsフォルダとか消していろいろ試しても無理でして。
12:08 PM
[CP] Check Pods Manifest.lock の内容は下記のとおり
12:08 PM
diff "${PODS_PODFILE_DIR_PATH}/Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null if [ $? != 0 ] ; then # print error to STDERR echo "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation." >&2 exit 1 fi
Avatar
I'm currently working on an objective c project where we are trying to now incorporate swift into the project. When I add a Swift unit test to the project I get the following prompt: I create the
2:00 PM
差し支えなければPodfileとPodfile.lockの内容は上げれますか?
Avatar
platform :ios, '9.0' target 'XXXXX' do pod 'CorePlot', '2.2' pod 'Google-Mobile-Ads-SDK', '7.20.0' pod 'FBSDKCoreKit', '4.23.0' pod 'FBSDKLoginKit', '4.23.0' pod 'FBSDKShareKit', '4.23.0' pod 'Flurry-iOS-SDK/FlurrySDK', '8.1.0' pod 'Fabric', '1.6.11' pod 'TwitterKit', '2.8.1' pod 'TwitterCore', '2.8.0' pod 'Crashlytics', '3.8.4' pod 'SVProgressHUD', '2.1.2' pod 'Realm', '2.7.0' pod 'Repro', '2.4.0' pod 'SwiftLint', '0.19.0' end post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['CLANG_WARN_DOCUMENTATION_COMMENTS'] = 'NO' end end end
4:25 PM
PODS: - Bolts (1.8.4): - Bolts/AppLinks (= 1.8.4) - Bolts/Tasks (= 1.8.4) - Bolts/AppLinks (1.8.4): - Bolts/Tasks - Bolts/Tasks (1.8.4) - CorePlot (2.2) - Crashlytics (3.8.4): - Fabric (~> 1.6.3) - Fabric (1.6.11) - FBSDKCoreKit (4.23.0): - Bolts (~> 1.7) - FBSDKLoginKit (4.23.0): - FBSDKCoreKit - FBSDKShareKit (4.23.0): - FBSDKCoreKit - Flurry-iOS-SDK/FlurrySDK (8.1.0) - Google-Mobile-Ads-SDK (7.20.0) - Realm (2.7.0): - Realm/Headers (= 2.7.0) - Realm/Headers (2.7.0) - Repro (2.4.0) - SVProgressHUD (2.1.2) - SwiftLint (0.19.0) - TwitterCore (2.8.0): - Fabric - TwitterKit (2.8.1): - TwitterCore (>= 2.8) DEPENDENCIES: - CorePlot (= 2.2) - Crashlytics (= 3.8.4) - Fabric (= 1.6.11) - FBSDKCoreKit (= 4.23.0) - FBSDKLoginKit (= 4.23.0) - FBSDKShareKit (= 4.23.0) - Flurry-iOS-SDK/FlurrySDK (= 8.1.0) - Google-Mobile-Ads-SDK (= 7.20.0) - Realm (= 2.7.0) - Repro (= 2.4.0) - SVProgressHUD (= 2.1.2) - SwiftLint (= 0.19.0) - TwitterCore (= 2.8.0) - TwitterKit (= 2.8.1)
4:26 PM
SPEC CHECKSUMS: Bolts: 8a7995239dbe724f9cba2248b766d48b7ebdd322 CorePlot: cbe0c6e14220705e32e06a89c7d6a5a908b7d7d8 Crashlytics: 79e236942ca1e7fc641df1feb9a275360a78ab6a Fabric: 5911403591946b8228ab1c51d98f1d7137e863c6 FBSDKCoreKit: d7829f5a69901cd7296105328e4c3c3fc7da6518 FBSDKLoginKit: 6b92bd65f319d669d2b0730e49db495ef1660566 FBSDKShareKit: 65751c3b9937ab9d594e6c37611ecc115ceeb448 Flurry-iOS-SDK: 51065be4436f3e21fc8d3d7bb0b7d6869df6333d Google-Mobile-Ads-SDK: 168312cdc167fa22746d4ea8e839fc4825dd2966 Realm: 07e5d3a9e0e41d65fd5f9f05150ed6295d0f093b Repro: e69274efa79b1e8f25ec14177356968d9a8e8224 SVProgressHUD: c404a55d78acbeb7ebb78b76d3faf986475a6994 SwiftLint: 3537a05b34060e78e7510f04fb7537d738247803 TwitterCore: e959987be23c767004d29eb7fab8d85d8585a2e5 TwitterKit: 3b6044a7320340326a4098f3e37aa1dbaeb94942 PODFILE CHECKSUM: 47c07dc78a6793f29d1576ffa394f4c5e5b5076e COCOAPODS: 1.2.1
4:26 PM
ありがとうございます。Podfile.lockはDiscordの文字数制限でエラーになったので分割しました。
Avatar
上記の件、再起動して、Derived Dataをけしてクリーンしてビルドしたら正常に動作しました。金曜日にも同じ手順でやっても駄目だったんですが、今日やるとできました。
Avatar
おっ、再現できなくて参っていました、お力添えできずすみません。
Avatar
いえ、反応していただいただけでも、とても嬉しかったです。ありがとうございます。これで安心してWWDC見れます。
🎉 1
Avatar
くっ、ビルドはできたけど、アーカイブが同じエラーで止まってしまった
4:38 AM
辛い
Avatar
omochimetaru 6/5/2017 4:39 AM
~/Library/Developer/Xcode/Archivesも消してみては?
4:40 AM
Xcodeを Cmd + Q で終了してから以下を削除 ~/Library/Developer/Xcode/Derived Data ~/Library/Developer/Xcode/Archives
Avatar
~/Library/Developer/Xcode/Archivesも消して空です
Avatar
omochimetaru 6/5/2017 4:41 AM
むむむ
4:42 AM
そもそもCocoapodsの利用をやめることは難しいですか?
4:42 AM
僕はCocoaPodsもCarthegoも、オレオレビルドプロセスを取るのが嫌いで、使ってないんですよね こういう問題が起こった時に困る
Avatar
検討してますが、上記のPodfileを見るとおわかりかと思うのですが、coreplotを切ってから全てをCarthageに移行しようかと思ってまして。
Avatar
omochimetaru 6/5/2017 4:43 AM
なるほど
Avatar
あ、Cartheageもですか、では、自分でプロジェクトに手動で追加してると
Avatar
omochimetaru 6/5/2017 4:43 AM
はい。
4:43 AM
xcworkspaceで作業場を作って、ライブラリはxcodeprojをそれに追加する形にして、
4:44 AM
embedded libraryの依存を組んでビルド
4:44 AM
基本的にgit submoduleでやってます
4:44 AM
でも、kuroさんのケースだと使用数が多いから、carthageでcheckoutだけやって、ビルドだけxcodeに登録するのが良さそうな気もします
Avatar
embedded libraryの依存を組んでビルドして git submoduleでビルドする構成をやったことがないので知識が乏しいですが、その方法も考えて今後対応してみます。
4:48 AM
実は今回のエラーは、ビルド用、アーカイブ用のiMacでのみエラーが起きてて、普段開発で利用しているMBPでは特にエラーが発生せずにビルドできています。今回は、MBPの方でアーカイブ作成して申請することにしました。
4:48 AM
でも、今までとくにエラーもなくiMacでもビルドできていたので、なんでエラーが出てるのか正直よくわからなくて困っています。
Avatar
omochimetaru 6/5/2017 4:48 AM
なるほど・・・
Avatar
iMacとMBPのOSバージョンやXcodeのバージョンはもちろん同じなので
4:49 AM
cocoapodsも同じ
4:49 AM
なので、どこが問題の原因になっているのか特定できずうーんて感じです。
Avatar
omochimetaru 6/5/2017 4:50 AM
diff "${PODS_PODFILE_DIR_PATH}/Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null if [ $? != 0 ] ; then # print error to STDERR echo "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation." >&2 exit 1 fi
4:50 AM
このエラーメッセージが出てるってことは、 ${PODS_PODFILE_DIR_PATH}/Podfile.lock と ${PODS_ROOT}/Manifest.lock の間に diff があるということですけど
4:50 AM
どんな差分だったんですか?
Avatar
あ、いや echo "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. このメッセージは出て無くて、差分はないと思います。
Avatar
omochimetaru 6/5/2017 4:52 AM
ああ、なるほど
4:52 AM
[CP] Check Pods Manifest.lock < これは 緑のアイコンだった。
Avatar
このエラー
4:52 AM
なので、unknown reasons なのでわからんいんです。
4:53 AM
うーん、やっぱりomochimetaruさんのビルド方法を検討するほうが、無駄な問題に悩むずに済むような気がしてきました。
Avatar
omochimetaru 6/5/2017 4:53 AM
console.app に関係ありそうなログは出てませんか?
4:54 AM
individual build tasks 達が内部で抱えたエラーについての情報が集められないと厳しそう (edited)
Avatar
ほう、console.appですか、見てみます。
Avatar
omochimetaru 6/5/2017 4:55 AM
はい、一部のプロセスやデーモンはここにエラー吐いてる事があります。
4:58 AM
ビルド方法
1. xcworkspaceを作る。(これ自体はただのxcodeprojの配列のようなもの) 2. ライブラリとアプリのxcodeprojをxcworkspaceに追加する 3. アプリの ターゲット の General / Embedded Frameworks and Libraries の一覧の「+」を押してダイアログを出す。 4. ダイアログの中に、xcworkspaceに入れてあるxcodeprojのライブラリターゲットが並んでるので、それを選ぶ 5. アプリをビルドすると依存ビルドされる という感じ
5:00 AM
デメリットとしては ・ライブラリのバージョン合わせについては手動でがんばる(か、carthageをそのチェックアウトだけに使うなど) 工夫が必要 ・xcodeの schema リストに、入れてある全てのxcodeprojのターゲットが突っ込まれるので、めちゃくちゃターゲット数が多くなって気持ち悪い。これは心の目で無視する。 ・普段はキャッシュされるのでアプリ部分だけのリビルドで済むけど、何かが壊れた時にはクリーンする必要があって、その場合ライブラリ全部リビルドになるので待ち時間が長い。
Avatar
ありがとうございます。涙が出ます。
5:01 AM
console.app を開けながら
5:02 AM
再度Xcodeでアーカイブして失敗したのですが、どこにエラーらしきログが出ているのか
5:02 AM
把握するのが難しい。
Avatar
omochimetaru 6/5/2017 5:03 AM
macOS Sierraだとして、デバイスのとこでマシン名出てるの選んで、上部のバーで「エラーと失敗」のタブを開いておく
Avatar
ああ、デバイスを選ぶと「エラーと失敗」のタブが選択できるんですね。できた。
Avatar
コンソールのエラータブに出てたエラー
5:14 AM
Xcodeでアーカイブしているときに出たエラーは、これだけでした。
5:15 AM
でも、あまり関係なさそうな。
Avatar
エラーの詳細
5:24 AM
skylight framework ? 初めて聞く名前
Avatar
omochimetaru 6/5/2017 5:57 AM
Skylight.frameworkでググるとSierraにしたらクラッシュするようになった、みたいなイシュー報告と共に出てきますね
5:58 AM
いまいちわからないですねえ
Avatar
ぐぐると、でますね。もう少し色々ためして様子を見ます。omochimetaruさん色々反応してくださりありがとうございます。
Avatar
omochimetaru 6/5/2017 6:05 AM
はいー
Avatar
Alamofire(HTTPリクエストを簡単にするラッパーのライブラリ)でAPIにリクエストした結果を、どうしてもストレージにキャッシュさせたくないんですが、いい方法はないでしょうか。 https://stackoverflow.com/questions/32199494/how-to-disable-caching-in-alamofire を参考にしてみたのですが、どうやらこれは「現在のリクエストについて、キャッシュされていたデータを利用するかしないか」という設定なのか(これは勝手な推測です)、iPhone SimulatorのLibrary/Cachesの中にはAPIリクエストの結果が保存されてしまいます。 (edited)
When I send a GET request twice with Alamofire I get the same response but I'm expecting a different one. I was wondering if it was because of the cache, and if so I'd like to know how to disable it.
Avatar
URLCache.shared = URLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil) で解決しました(この方法だとアプリ全体でキャッシュが効かなくなりますが、画像周りは独自のキャッシュを実装していたので今回は影響がなかった
🙂 2
🙃 1
Avatar
HTMLから変換したNSAttributedStringで、リンクをタップした際の挙動をSafariを開く挙動から自分で定義した挙動に変更するにはどうしたらいいのでしょう
Avatar
delegate実装すれば拾えますよ
Avatar
なるほどdelegate
12:32 AM
ありがとうございます
3:37 AM
上記のエラーに悩まされていまして,
3:37 AM
Xcodeビルドできない状態が続いています。
3:37 AM
Clean Clean build folder Quit Xcode Open Finder then go to ~/Library/Developer/Xcode/DerivedData then deleated everything inside Open Xcode Build
3:37 AM
一通り試したのですが、エラーが解消できず。
3:38 AM
同じエラーに遭遇した方いらっしゃいますか?
3:38 AM
ちなみにobjcのファイルをswiftにリファクタリングしているときに起こります。
3:38 AM
Xcodeは8.3.3です。
Avatar
上記の件、一応解消できたので報告。Macの初期化までして色々試してもだめでしたが、cocoapodsやfastlaneを管理するGemfileやvendor/bundleフォルダを削除すると正常にビルドできるようになりました。fastlaneをつかったモダンなデプロイ環境は一旦諦めることになってしまいました。なぜ、Gemfileやvendor/bundleフォルダがあると、上記のエラーが頻発する(エラーがでないときもある)のかはわからなかったです。いつもswiftのコンパイルが始まると上記のエラーになるので、もしかするとswiftのコンパイラーと私のGemfile等の設定の相性が悪いのかもしれません。どこかのブログでobjcとswiftの混合プロジェクトにおいて、swiftファイル数が多くなるとビルドに失敗することが多くなるといった記事を見かけたので、それも原因の一つかもしれません。ちなみに、エラーの起きていたプロジェクトの構成は objc (1194ファイル)でswift(378ファイル)あります。全てswiftにするまでの道のりは結構険しい。
4:56 AM
長文失礼しました!
Avatar
omochimetaru 6/21/2017 4:56 AM
お疲れ様です・・ 長文気にしなくて大丈夫です
Avatar
そう言っていただけるとありがたいです
😀 2
4:57 AM
なんか質問しかしてないアカウントになりつつあるので、ちゃんと何かしらの形で貢献しないと!(できるのか笑)
Avatar
omochimetaru 6/21/2017 4:59 AM
質問をすると他の人が質問をする心理的ハードルが下がるという貢献があります
😀 4
Avatar
rbenv, rbenv-gemset, bundler併用するとどうなるでしょう、環境汚さないでgemの管理ができるようになるので何か変わるかもしれません
Avatar
rbenvでrubyのバージョンを固定して bundle install --path vendor/bundle して bundle exec fastlane ios staging とか bundle exec pod install とかしてました。 rbenv-gemset (edited)
5:04 AM
は知らなかったので今度試します。
Avatar
なるほど...問題なさそうな構成ですね 手元でcocoapods、fastlane動いてるGemfileになります、お役に立つか分からないですが # frozen_string_literal: true # A sample Gemfile source "https://rubygems.org" gem "fastlane" gem 'cocoapods' gem 'cocoapods-keys'
Avatar
ありがとうございます。ほぼ一緒ですね
5:08 AM
source "https://rubygems.org" gem "cocoapods", '1.2.1' gem "fastlane", '2.11.0'
🤔 1
5:08 AM
fastlaneのバージョンが古いのは
5:08 AM
New Issue Checklist Updated fastlane to the latest version I have read the Contribution Guidelines Issue Description I updated fastlane(2.11.0) to the latest version(2.23.0) by bundle update fa...
5:09 AM
このエラーに悩まされて、fastlaneにissueを投げた当時から固定してたからです。
5:09 AM
当時の構成とはまたcocoapodsとかコードの構成が変わっているのでまたやると同じかどうかわからないですが。
Avatar
これから取り急ぎiOSアプリ開発を始める人に向けて、本を2冊だけ紹介しようとしてます。 1冊は言語周りということでSwift実践入門を薦めようと思ってます。 ただ、もう1冊どうしようかなと悩んでます。 内容的にはUI周りを含めた現段階でのプラクティス本を薦めたいのですが、心当たりある方いらっしゃいませんか? 昔でいうとtokoromさんのiPhoneプログラミングUIKit詳解リファレンスみたいなのの現代版があるとウレシィのですが。。
Avatar
プログラミングの経験はどのぐらいある方ですか?
Avatar
4年目Androidエンジニアです。 職場のコードがレガシーMVCだらけな中、自分からRxJavaとMVVMに挑戦中のモチベーション高めなエンジニアですー
Avatar
そういった本がSwiftになってからでてないのがほんとに寂しいんですけど、僕が前新卒に課題図書として出した本の中から1冊だけ紹介しておきます。2冊出したんですけど、もう一冊はプログラミングの初歩から書いてある本で、4年目の方だとつまんなく感じてしまうと思うので。 本気ではじめるiPhoneアプリ作り Xcode 8.x+Swift 3.x対応 (ヤフー黒帯シリーズ) 西 磨翁 https://www.amazon.co.jp/dp/4797389826/ref=cm_sw_r_tw_dp_x_FBivzbQ7Z4187
😊 1
Avatar
おお、ありがとうございます。良さそうですね!
5:20 AM
ボソッ (アフィ付きでいただければそこからポチりますよ〜)
Avatar
(クッソそういうの持ってない😇
😇 2
Avatar
ではこのままポチらせていただきますw d_dateさんありがとうー
Avatar
omochimetaru 7/7/2017 2:15 AM
あれ?
2:15 AM
なんか今ファントム投稿あった?
Avatar
ファントム投稿w
2:15 AM
読んでたら消滅した
Avatar
ファントムしましたw 途中でなげてしまったので、今やりなおしてますw
Avatar
omochimetaru 7/7/2017 2:15 AM
「幻影だ」
Avatar
Enter で投稿するシステム、人権侵害なので国連で規制議論されてほしい
Avatar
iPhone版なら改行は改行だよ
Avatar
あー、モバイル版は人権守られてますね
Avatar
omochimetaru 7/7/2017 2:17 AM
Enter押すな
Avatar
Shift + Enter できないから
2:17 AM
SKK 過激派か?
Avatar
iPadはEnterで飛んでいきますね
2:17 AM
どこに投げていいかわからないトピックなので、とりあえずここに投げてみます。 VCのViewDidLoadで、あるメソッドを通過していないときにエラーを吐かせたいと思ってるんですけど、assertを書くことにすると、そもそもassertを書く人はそのメソッドを呼ぶのが必要だと認知しているので、assertはいらないことになります。 具体的には、Clean Architectureで、画面遷移前にpresenterをinjectするようなケースです。presenterはIUOで定義しているので、セットしていないpresenterにアクセスした時点でクラッシュするのでランタイムでは検知できますが、ビルドエラーで検知できたらベストだと思っています。このあたりみなさんどんなふうにやってますか?
Avatar
VCにカスタムinit定義するのがはやいんじゃ
Avatar
omochimetaru 7/7/2017 2:19 AM
同じような悩みを抱えたことがある気がする
2:19 AM
コンストラクタが使えれば解決するけどXIBとの兼ね合いでできず
Avatar
こういう便利なものがありまして(ステマ) https://github.com/tarunon/Instantiate
Instantiate - Type-safe and constructor injectable InterfaceBuilder protocols.
Avatar
omochimetaru 7/7/2017 2:19 AM
このViewControllerはこのプロパティを埋めてからpresentしろってなる
2:20 AM
injectって言ってるからこの場合はプロパティを埋めるんじゃなくて初期設定メソッドを呼ぶみたいな感じだろうけどまあsetter呼び出しもメソッドと考えると同じ
2:20 AM

as is

let storyboard = UIStoryboard(name: "ViewController", bundle: Bundle.main) let vc = storyboard.instantiateInitialViewController() as! ViewController vc.inject([1, 2, 3])

to be

import Instantiate import InstantiateStandard extension ViewController: StoryboardInstantiatable {} let vc = ViewController(with: [1, 2, 3])
Avatar
そのまま使うとviewを先にloadしちゃうけど、ちょっと拡張すればview後にloadも出来るから多分大丈夫じゃないかな
Avatar
omochimetaru 7/7/2017 2:22 AM
これってこの ViewController.init(with:) を 呼ぶことを忘れなければうまくいくけど
2:22 AM
それを呼ぶのを忘れない仮定をおけるのであれば
2:22 AM
規定の初期化処理をするのを忘れないと言えそうな気が。
2:23 AM
もちろん、忘れない前提において、tarunonのやつのほうがスッキリするところは旨味だけど
2:23 AM
相談内容の前提は解決してない気がする。
Avatar
他のinitをunavailableすればオッケーですね
Avatar
omochimetaru 7/7/2017 2:23 AM
お、なるほど・・・
Avatar
overrideでunavailableできますよ
Avatar
omochimetaru 7/7/2017 2:24 AM
Instantiateの内部で他のinit呼んでてそこでunavaiable警告出たりしないの?
Avatar
nib/sbから取り出してるからinitは存在しない
Avatar
omochimetaru 7/7/2017 2:24 AM
確かに!!!!!
2:24 AM
そうですね。
Avatar
そもそもassertを書く人はそのメソッドを呼ぶのが必要だと認知しているので、assertはいらないことになります。
これって VC を実装する人目線ですか?使う人目線ですか?↑の @omochimetaruinject みたいに「あるメソッドを通過」が外から呼び出すことを意図しているなら、 assert を書く人と呼び出す人が別な気がするので「assertはいらない」ことにならない気がするんですが・・・。
(edited)
Avatar
自分は遷移処理を抽象化してVrewController用のRouter書いてしまってます requestに対してrouterがviewControllerのインスタンスを返す、みたいな
Avatar
inject関数が型として抽象化されていて、viewControllerのタスクも同様に抽象化されていれば
2:30 AM
injectの引数からviewControllerのタスクの結果を取り出すRouterみたいなのも普通に出来ますね
Avatar
omochimetaru 7/7/2017 2:31 AM
@moaible ナマのstoryboardメソッドや生のコンストラクタは触らない規約でやっていくってことですか?
Avatar
@omochimetaru ViewControllerにrouterに適合させるためのstaticな関数を置いて、そこに問い合わせるのでその中なら生のコンストラクタを使ってもいいですし、storyboardから生成してもいいしって感じにしてます
Avatar
omochimetaru 7/7/2017 2:33 AM
なるほど
Avatar
案の定だけど議論の中身が #swift みてきた
Avatar
omochimetaru 7/7/2017 2:35 AM
@unavailable をある特定の呼び出しにおいてだけ警告抑制できれば
2:35 AM
staticメソッドおいておいて他のファクトリ経由を矯正することがある程度できそうですね
Avatar
ちょっと話かけられて離れてる間にすごい進んでました😇 ありがたいです
Avatar
omochimetaru 7/7/2017 2:35 AM
@moaible のRouter や @tarunon のInstantiateと同じように
Avatar
Instantiateはinitアレするので、alloc/deallocが一回ずつ余分に発生するけどね。
2:36 AM
@rintaro 先生ソース
Avatar
omochimetaru 7/7/2017 2:36 AM
storyboardから取り出すメソッドを利用禁止するのは無理かなあ
Avatar
スコープ対象の unavailable が欲しい時がある。 @available(*, unavailable, scope: public) 的な (edited)
Avatar
あるある
2:37 AM
storyboard自体は禁止しなくても流石にinitとかfactoryメソッド生えてたら間違えないとは思うけど
2:43 AM
overrideせずにprotocol生えてたらこのメソッド禁止!トかやりたいけど出来ない。
Avatar
みなさんありがとうございます。どれも良さそうなんですけど、tauronさんのInstantiateを採用するのが今のソースコードには合ってそうな感じがしました。 (にしてもこのあたりもうちょっと簡単にできたらいいなー…)
Avatar
norio_nomura 7/7/2017 12:26 PM
githubのリポジトリへのアクセスにsshをあえて使う理由って何があるのでしょう?
Avatar
二段階認証してると、HTTPSでpushするときにgithubのアカウントのパスワードが使えないとかですかね
Avatar
トークンで良いはず
12:53 PM
何もかもが面倒臭くてhttpsを使いがち。
Avatar
あーたしかに
12:53 PM
あとはgithubのパスワードをローカルのストレージに保存しなくていいとかですかね
12:54 PM
(それもtoken使えばいいか)
Avatar
omochimetaru 7/7/2017 1:22 PM
@norio_nomura pushするために自分のリポジトリはそうしてます。認証機構としてssh-agentなのも安心感がある。
1:22 PM
httpsだとコンソールでuseridとpassword聞かれるけどそれはどうなるんだろ
1:23 PM
githubにかぎらず普通にssh先のサーバーにリポジトリ設置したりした場合も
1:23 PM
httpsよりそっちのほうが素直に構築できるし。
1:24 PM
僕も push するリポジトリは ssh です。
Avatar
norio_nomura 7/7/2017 1:24 PM
パーソナルトークンをそれでkeychainへ入れてますね。
Avatar
omochimetaru 7/7/2017 1:26 PM
なんかすでにそれもセットアップしてあった
1:26 PM
たしかgithubってHTTPSでリードしかしてなくても
1:26 PM
たくさんやってるとブロックされた気がする
1:27 PM
このマニュアル見る限りあそこでコンソールでパスワードいれたら保存されるのか・・・?
Avatar
norio_nomura 7/7/2017 1:27 PM
パーソナルトークン使ってるとその制限は緩くなったはずです。>アクセス権限 (edited)
Avatar
omochimetaru 7/7/2017 1:28 PM
はい。リードでブロックされて、調べて、これをセットアップしたような記憶がありまsj
1:31 PM
うーんそうするとhttpsでもいいのかなあ。
Avatar
norio_nomura 7/7/2017 1:31 PM
このマニュアル見る限りあそこでコンソールでパスワードいれたら保存されるのか・・・?
キーチェーンに保存されます。
Avatar
omochimetaru 7/7/2017 1:31 PM
gitプロトコルについてよくしらないんですけど
1:31 PM
sshでパイプで相互IOつないで
1:31 PM
差分計算とかいろいろやってるけど
1:31 PM
httpsのときも
1:31 PM
トランスポートが違うだけで同等なことができているのか
1:32 PM
httpsだと簡易的な(効率の悪い)プロトコルになるのか
1:32 PM
そういうのが気になる。
1:32 PM
思い出してきた、昔読んだ何かにそんな話題があったようななかったような
Avatar
norio_nomura 7/7/2017 1:33 PM
sshの場合、ちゃんと設定しないとhttpsより遅かったはずです。
1:33 PM
>SSH : 最後に、HTTP/S、Git、Local プロトコルと同程度に効率的です。転送するデータを可能な限りコンパクトにすることができます。
1:34 PM
しかしバージョン 1.6.6 でより高機能なプロトコルが導入されました。これは、SSH の場合と同じように、HTTP でのデータのやりとりも Git が賢く処理できるようにするためのものでした。 ここ数年で、新しいほうの HTTP プロトコル はとても多く使われるようになりました。ユーザーからすればこちらのほうがシンプルですし、通信方法としても優れているからです。 新しいほうは “smart” HTTP プロトコルと呼ばれていて、古いほうは「ダム」(dumb)HTTP プロトコルと呼ばれています。 まずは “smart” HTTP プロトコルのほうから説明しましょう。
1:34 PM
HTTPS上のgitに2種類あって、1.6から smart HTTP というのができて
1:34 PM
これが効率的らしい
1:35 PM
自分がgit勉強したときこの記述なかった気がするし知識が古かったのか
1:36 PM
1.6が 2010年9月だしそんなこともなさそう・・・
1:42 PM
Username for 'https://github.com': omochi Password for 'https://omochi@github.com': remote: Invalid username or password.
1:42 PM
パスワード通らない・・・
1:43 PM
ああ、2FAの場合の設定は別口からやるのか
Avatar
norio_nomura 7/7/2017 1:56 PM
If you have enabled two-factor authentication, or if you are accessing an organization that uses SAML single sign-on, you must provide a personal access token instead of entering your password for HTTPS Git.
https://help.github.com/articles/which-remote-url-should-i-use/
Avatar
omochimetaru 7/7/2017 1:56 PM
セットアップできました。
Avatar
omochimetaru 7/11/2017 2:14 AM
Via HTTPS For those checking out sources as read-only, HTTPS works best: git clone https://github.com/apple/swift.git ./swift/utils/update-checkout --clone Via SSH For those who plan on regularly making direct commits, cloning over SSH may provide a better experience (which requires uploading SSH keys to GitHub): git clone git@github.com:apple/swift.git ./swift/utils/update-checkout --clone-with-ssh
2:14 AM
swiftのリポジトリにも、sshのほうが may provide a better experience って書いてあるけど
2:15 AM
この前のからするとそうでもなさそう
Avatar
import UIKitしてるファイルで、UI系のクラスを使っていなくて、import Foundationで事足りる場合、Foundationに変更した方がいいですよね? UIKitのままにしておくメリットってないですよね?
Avatar
僕の知る限りはないように思います。
Avatar
ありがとうございます!
Avatar
import UIKit let numbers = (1...5).map(String.init) print(numbers) // ["1", "2", "3", "4", "5"] var a: [String] = [] // No Error a = Array(numbers.prefix(3)).map { $0 } print(a) // ["1", "2", "3"] // No Error let arraySlice: ArraySlice<String> = numbers.prefix(3) a = arraySlice.map { $0 } print(a) // ["1", "2", "3"] // Error(error: ambiguous use of 'prefix')→ なぜエラーに? // a = numbers.prefix(3).map { $0 }
4:27 AM
最後の numbers.prefix(3).map { $0 } ambiguous use of 'prefix' になる理由がわからず。
Avatar
前に #swift 部屋で話題になったやつだ
Avatar
あ、既出ですか
4:28 AM
出遅れた
Avatar
要約するとたしか、prefixはoverloadになっていて、その両方Sequence型でmapを持っているため
4:29 AM
だったかな
Avatar
#swift 部屋を遡ってみます
Avatar
prefixで検索すると見つかります
Avatar
ありがとうございます。
Avatar
5月23日ですね
4:31 AM
パーマリンクほしいなぁw
Avatar
(同じく検索してパーマリンク取ろうとしたけどできなかった)
Avatar
ジャンプボタンが存在するんで、内部的にはありそう(作れそう)なんですけどね
Avatar
t.aeさんの話ですね
Avatar
ArraySliceにおいてprefixはAnySequenceとArraySliceのoverloadで、これのどちらであるかを判別できなくなるのが原因ですね。
😃 1
4:34 AM
evolutionにはSequenceのassociatedtypeにSubSequence型を追加して解決しようよという提案があった記憶があります、どうなったかは追いかけれていない。
4:35 AM
あれ、入ってるな
4:35 AM
何かと勘違いしていたみたいです、すみません。
Avatar
ArraySliceにおいてprefixはAnySequenceとArraySliceのoverloadで、これのどちらであるかを判別できなくなるのが原因ですね
👍 1
4:36 AM
納得しました!ありがとうございます。
Avatar
RGBA のピクセル列から NSImage を生成して tiffRepresentation を呼ぶと nil が返ってきてしまうんですが、解決策をご存知の方はいませんか? 今やっているのは↓で、 let image = NSImage(cgImage: cgImage, size: NSSize.zero) image.tiffRepresentation // nil この cgImage は↓のように生成されています。 extension Image where Pixel == RGBA { public var cgImage: CGImage { let length = count * 4 // count == width * height var data = Data(capacity: length) data.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer<UInt8>) -> Void in // 略 } let provider: CGDataProvider = CGDataProvider(data: data as CFData)! return CGImage(width: width, height: height, bitsPerComponent: 8, bitsPerPixel: 32, bytesPerRow: width * 4, space: Image.colorSpace, bitmapInfo: Image.bitmapInfo, provider: provider, decode: nil, shouldInterpolate: false, intent: CGColorRenderingIntent.defaultIntent)! } fileprivate static var colorSpace: CGColorSpace { return CGColorSpaceCreateDeviceRGB() } fileprivate static var bitmapInfo: CGBitmapInfo { return CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue | CGBitmapInfo.byteOrder32Big.rawValue) } } tiffRepresentation のドキュメントには↓のようにありますが、特に PDF や EPS のようなベクター形式の representation にはなっていないと思います。 "if the TIFF data cannot be created" の原因がわからず・・・。 If one of the receiver's image representations does not support the creation of TIFF data natively (PDF and EPS images, for example), this property creates the TIFF data from that representation's cached content. This property contains nil if the TIFF data cannot be created. https://developer.apple.com/documentation/appkit/nsimage/1519841-tiffrepresentation なお、同様の手法↓で生成されたグレースケールの CGImage から作られた NSImage や、 PNG ファイルを読み込んで生成された NSImagetiffRepresentation は正しく動作します。 https://github.com/koher/EasyImagy/blob/05db8c28d034a36cef3a8271d2daa214c8ad5ee4/EasyImagy/ImageCoreGraphics.swift#L133-L147
EasyImagy - Makes it easy to deal with images in Swift
8:44 AM
Avatar
@koher まずいのはここだと思います。
10:55 AM
var data = Data(length: length) で初期化しないと、capacity あっても直接イニシャライズすると length は 0 のままなので。 (edited)
10:57 AM
それか、init(capacity:) で生成して、 data.length = length で拡張するか。← データ突っ込んだ後にやると 0 で初期化されるので注意 (edited)
😲 2
11:01 AM
あ、Data.init(count:) だ。 issue からリンクされているプロジェクトでは NSMutableData だった。
Avatar
NSMutableData(length:)で正常に取得できることを確認しました。
12:31 AM
僕もソースは読んでたんですがcapacitylength/countは盲点でした…… ポインタと合わせる場合は特に要注意ですね
Avatar
おおお、そんなところをミスってるとは・・・。完全に盲点でした・・・。ありがとうございます!!
1:06 AM
CoreGraphics と AppKit の方ばっかり調べて Data の使い方を間違えている可能性をまったく考えませんでした・・・。
Avatar
@rintaro おかげで fix できました!ありがとうございました。 https://github.com/koher/EasyImagy/pull/16
👍 1
Avatar
SwiftLintを0.22.0に上げるとデフォルトで2つ目のクロージャー引数に警告が出るようになりました。新しいルールの詳細はこのissueのようです。https://github.com/realm/SwiftLint/issues/1801
New Issue Checklist Updated SwiftLint to the latest version I searched for existing GitHub issues Rule Request In many cases, the trailing closure syntax can make code clearer by reducing boile...
7:25 AM
UIView.animate(withDuration: 1.0, animations: { someView.alpha = 0.0 }) { _ in someView.removeFromSuperview() }
7:26 AM
これを警告を出さずに同じことを0.22.0でも書こうとすると、どのように書くべきなのかわからず。
7:28 AM
アニメーションが完了した後の処理を2つ目のクロージャーで処理したいのに警告が出て困る。issueの作成者が言う、2つめのクロージャーの処理が曖昧だというのはラベルが省略されているからまだ理解できますが、多くの場合は不要と言っている意味がよくわからず。 (edited)
7:30 AM
なぜこのルールがデフォルトで警告になったのか…。 (edited)
Avatar
Deleted User 9/3/2017 7:49 AM
クロージャを2つ以上引数に渡す場合はTrailing Closuresを使わずに、分かりやすくちゃんとラベルを付けましょうってことですよね? UIView.animate( withDuration: 1.0, animations: { someView.alpha = 0.0 }, completion: { _ in someView.removeFromSuperview() } )
🙏 1
Avatar
ありがとうございます。2つ目のラベル名をいつも省略して書いてたので、ラベル名を付けたまま書くスタイルがわからず困ってました。ありがとうございました! (edited)
👍 3
Avatar
もう少しで iOS 11 の GM 版がリリースされそうですが、 GM 版でアプリを申請して審査に通った場合、 App Store から配信されるのはどの時点になるのでしょうか? 正式版がリリースされるタイミングですか?それとも GM 版 iOS が入った端末であれば審査に通った時点からインストールできるようになるのでしょうか? Deplayment Target は新しくリリースされるバージョン(今回であれば iOS 11 )を想定しています。 これまでに GM 版で申請した経験がないためよくわからず、ご存知の方がいれば教えていただけると助かります🙏
Avatar
@koher 過去のバージョンでiOSxx対応みたいなのがリリース前に出ていたのは覚えていて、それに習うなら配信されるのはリリース前も有り得ると思います。
👏 1
Avatar
なるほど。ありがとうございます!
Avatar
var dict1 = ["May 21": [1,2], "May 22": [3,4]] var dict2 = ["May 22": [5,6], "May 23": [7,8]] dict1.merge(dict2, uniquingKeysWith: +) print(dict1) // ["May 22": [3, 4, 5, 6], "May 23": [7, 8], "May 21": [1, 2]]
6:13 AM
uniquingKeysWith に + を書くことてswift4で可能ですか? (edited)
6:14 AM
Xcode9でやるとエラーになるのですが。
6:16 AM
あ、わかりました。valueの型が一致してないと駄目なのか、失礼しました。
Avatar
Pythonの基本がわかってDjangoを使っている程度の中学生がiOS+Swiftプログラミングに入門するにはまず何から始めたらいいでしょう。おすすめの書籍などあれば教えて欲しいです。Playgroundで学んでいける課題でも良いかなと思ってます。私は一応SwiftでiOSアプリの開発はできるので教えることはできると思うのですが、やはり教材があると教えやすいかなと感じてます。
Avatar
最初のGettingStartedなかなか良いですね。中2なので英語だとちょっと時間がかかるかもしれませんが。
Avatar
おっさんでも英語だと時間掛かる人いるし問題ないですよ
😅 1
Avatar
うーん、さすがに中2だと英語はきつそうな気もしますけどね〜。
Avatar
逆に学習の動機づけとしてはよいのでは
1:57 AM
目的が倒錯した
Avatar
塾講師してたとき高校入試の英語長文読みましたが、中学生当時難しいと思ってた英文が簡単すぎて
1:58 AM
日本語のように読めておどろいたので、中学のときの英語力って今の僕らの感覚からすると相当低いかと。
1:59 AM
動機づけとしては良いとしても、階段のステップが大きすぎると壁になって登れずに挫折してしまうので、日本語でカバーできる範囲はまず日本語がいいような気がします。
Avatar
中学校英語とは全く語彙が違うので最初は難しく感じそうですね
Avatar
Pythonは日本語の資料を参照した感じですか? @rizumita
Avatar
Pythonは日本語の資料ですね。
2:01 AM
Djangoの情報は日本語の情報が少なかったのですが、英語の資料を読むのは中1だったのもあって無理でした。
2:02 AM
@tarunon
Avatar
英語問題は結構難しいと思っていて、ドキュメントが日本語だとしてもクラス名、メソッド名とかが英語なので小中学生くらいだとそこに辛さがありそうです。僕が小4でプログラミングを始めたときは、変数名は a とか b とか付けてたので。概念自体は理解できると思いますが、(自然)言語の壁がありそうです・・・。
Avatar
僕が中学生の時はコンパイラと戯れて理解してたな、ドキュメント参照しようにもダイヤルアップだからそれすら難しかった
2:07 AM
自然言語による理解を諦めてコンパイラと戯れよう
Avatar
前に小3にSwift教えようとしたら、アルファベットの大文字は読めるけど小文字が読めないという事案が発生しました。
Avatar
ゴールとしてはiOSアプリ自体の開発ですか?
Avatar
なかなかiOSのアプリ開発を初級者向けに抑えた日本語の本って聞かないな あるのかもしれんけど
Avatar
Udemyとかだとそういうのもあるのかなぁ?
2:10 AM
↑ここにもいっぱいありそう 英語だけど
Avatar
あ、日本語初心者向けコンテンツが、ね。 (edited)
Avatar
@tarunon ゴールはiOSアプリの開発だと思います。
Avatar
やっぱり早く SWIFT QUEST を作らねば・・・。
Avatar
Swift QuestはiOSアプリなんですか?
Avatar
基本は iOS 関係なく純粋 Swift だけど、発展系として Playground + UIKit もできないかなぁとは思ってる。
Avatar
なるほど。
Avatar
おじさんたちはSwiftの楽しさに触れて欲しいけど本人の希望ではなさそう
2:13 AM
GithubあさってサンプルコードやらOSSやらこねくり回してスパゲッティでもいいから動くもの出来ると楽しいのかな
Avatar
手っ取り早く楽しさを体験できる環境としては、 Playgrounds はいい気がしますけどね。
Avatar
私もSwift学習始めたばかりなので、この話題はとても気になります。 Swift Playgroundsって日本語対応していたかと思うのですが、これって他言語経験者も学習対象になっている感じなのでしょうか。 私はあいにくiPadを所持していないのでやったことがないのですが、これが完全初心者でなくてもかなり参考になるようなら、ここから始めてみるのもありなような気がします。
Avatar
Swiftにも興味はあるみたいです。Python以外の言語もやってみたいという動機もあるみたいなので。
Avatar
やっぱりビジュアルだと楽しいし。
Avatar
iPadのSwift Playgroundsはどっちかというと ノンプログラマー向けに プログラミングの楽しさを伝えるって感じで
2:15 AM
開発者が言語学習目的でやるとダレるかもしれない?
Avatar
初めて FLASH + ActionScript 触ったとき、楽しすぎて大学にも行かず 3 日くらいずっとそれやってました。 < ビジュアルだと楽しい
Avatar
参考書として http://gihyo.jp/book/2017/978-4-7741-8730-3 この書籍は良さそうな気がしますね。これ進めるだけだと中学生には退屈そうかも?なので、補助として。
本書は,Swiftの言語仕様と実践的な利用方法を解説した入門書です。 Swiftは簡潔な言語ですが,その言語仕様を理解し,正しく使うことはけっして容易ではありません。Appleの公式ドキュメントをはじめとして,どんな言語仕様があり,それらをどのように使うかに関しては豊富な情報源があります。しかし,それらがなぜ存在し,いつ使うべきかについてまとまった情報があるとは言えません。本書は,読者のみなさんの「なぜ」や「いつ」を解消することにも主眼を置いています。 本書では,はじめにSwiftの標準的な機能を一通り解説し,続いて型の設計指針や非同期処理,エラー処理などの実装パターンを説明します。最後に,実践的なSwiftアプリケーションの開発を通じて,それまでに説明した機能と実装パターンの具体的な活用方法を示します。
Avatar
Playgrounds は、 Mac の方の意図でした。
Avatar
ああそこ紛らわしいんですよね さっき僕が言ったのは iPadアプリの「Swift Playgrounds」は、プログラミング学習ゲームの事です
Avatar
二つは違うもののようで、 Mac の Playgrounds と同じような機能を iOS アプリの方も備えているからさらにややこしい・・・。
2:18 AM
↓のゲームみたいなのは、 Swift Playgrounds のコンテンツの一形態である Playground Book の、 "Learn to Code" というコンテンツです。 https://www.apple.com/jp/swift/playgrounds/
Swift Playgroundsは、楽しくインタラクティブな方法でSwiftのコードの書き方を学べるiPad用のアプリケーションです。アプリケーション上で直接ロボットやドローンを動かすプログラムを作れます。
Avatar
息子が第1回try! Swiftと一緒にあった子供向けワークショップに参加した時に、MacのPlaygroundsで教材が作ってあって楽しく学べたみたいなので、ああいう教材でより深く学べたらいいなぁと思いました。
🙂 1
Avatar
あ、そうか、Swift Playgroundsの中の、あくまで1つのコンテンツだった。
Avatar
何歳くらいのときですか?結構小さくてもできるものですか?
Avatar
@koher 小6の時ですね。
2:21 AM
もっと小さい子もいました。スーパー小学生だったので、その子は参考にならなそうですがw
Avatar
iPadの方のPlaygroundsで実際のアプリのコーディングをやっているという人もいて、実際にやっている人から気軽にやれておすすめとも聞いているので、ちょっと気になっています。
Avatar
なるほど。小6くらいならできるかもですね😃 天才児は参考にならないですねw (edited)
2:23 AM
iPadは入力が苦行なので個人的にはオススメできないです。。。
Avatar
ソンソンさんはキーボード並用してましたね。iPadと。 (edited)
Avatar
iPadは持ってないので…
Avatar
MacがあるならMacでやるのが楽だと思います。
2:25 AM
Swiftの勉強なら、英語さえ読めれば公式の↓を読むのが早いと思います。 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/index.html
2:25 AM
(iBooks版もあります)
2:26 AM
Read a free sample or buy The Swift Programming Language (Swift 4) by Apple Inc.. You can read this book with iBooks on your iPhone, iPad, iPod touch, or Mac.
Avatar
Mac向けにもああいうのを出してくれたらなやってみたいところです。 公式サイト見ながら、Playgroundでやっていけば良いのだとは思うのですが。 ちなみにiPadの方のPlaygroundsは入力補助が優秀で、あまりキーボードで打たなくてもいけるそうです。
Avatar
うーん、その辺りは感じ方に個人差があるかもです。僕は結構 iPad 版の入力補助がストレスフルでした・・・。
Avatar
やはり実際に触ってみないと分からないものですね。 日本語版の書籍と言うことなら、11月にSwift4の本がいくつか出るみたいですが、同シリーズのSwift3までの本を見てよさそうなのを見繕っておくというのもありでしょうか。
Avatar
たしかに、もうすぐ発売みたいですね。
Avatar
書籍は読んだことがないからわからないです😅
Avatar
私も読んだことがないので、書籍がいくつか出た頃に息子を書店に連れていくのが良いのかも?
Avatar
プログラミング初心者向けというのでなければ、↑で @masaichi さんが挙げていた「 Swift実践入門」はいいんじゃないでしょうか。
Avatar
僕は中学生の時ヨドバシカメラの技術書コーナーに行くのが好きで
2:41 AM
お小遣いが貯まると買ってた
Avatar
Swift実践入門は手元にあるので、Swiftに関してはそれを渡せばいいかもしれませんね。あとはiOSアプリの作り方の書籍を入手すれば。
Avatar
ドットインストールのiPhoneアプリ開発入門は、Xcodeの使い方を手っ取り早く知るには便利でした。 https://dotinstall.com/lessons/basic_iphoneapp_v3
iOSアプリの統合開発環境であるXcodeについて解説しつつ、簡単なアプリ開発の流れを見ていきます。
Avatar
@Puramu Xcodeだけじゃなく簡単なアプリの作成まで解説があるんですね。
Avatar
@rizumita Xcode上からプロジェクトを作ってシミュレータ上で動かすところまでの解説が動画であるので、個人的にはアプリ開発のイメージはつかみやすいなと思いました。
Avatar
問題はすぐに古くなってしまうことですねぇ☹
Avatar
古いのは残念なところ。
Avatar
一応 Xcode 9 で Swift 3.2 なら似たような環境で動かせる?
3:01 AM
ただ、問題が起きたときに初心者だと解決不能になりそうですね。
Avatar
私の場合、あえてXcode9でSwift4で同じように動かしてみましたが、問題なく動かせました。 バージョンが上がって暫くすると、最新バージョンに対応した講座がいつの間にか作られていたりするので、ちょこちょこ見てみるのも良いのかもしれません。
Avatar
なるほど。メンテされていて追従してくれるならいい感じそうですね。
Avatar
@Puramu それは良い情報。ありがとうございます!
Avatar
@rizumita 有料会員になると、もっと他の講座も見られるんですが、そちらだと実際にちょっと遊べそうなアプリ作成の例が結構あります。 有料講座も最初の数回は無料になっているやつもあるので、良さそうなのがあるのか先に見てみると良いと思います。
Avatar
@Puramu 見てみます!
Avatar
iBooksのApple Educationに日本語の教材があるみたいですよ。 https://itunes.apple.com/jp/author/apple-education/id939801385?mt=11
「教育者のためのリサーチアイデア集」、「Swiftによるアプリケーション開発:入門編」、「Swift Playgrounds: コードを学ぼう1&2」を含む、Apple Educationのブックをプレビュー、ダウンロード。
Avatar
おお、すごい。
Avatar
Apple Educationの「Swiftによるアプリケーション開発:入門編」の無料サンプルを閲覧または購入。このブックは iPhone、iPad、iPod touch、または Mac 上で iBooks を使って読むことができます。
Apple Educationの「Swiftによるアプリケーション開発:入門編」の無料サンプルを閲覧または購入。このブックは iPhone、iPad、iPod touch、または Mac 上で iBooks を使って読むことができます。
Avatar
@norio_nomura おぉそんなものが。ありがとうございます!早速ダウンロードしてみます。
Avatar
凄いです。私も後で見てみたいと思います。
Avatar
@tarunon #swift でちょいちょい話題に上がるboxingってなんすか
Avatar
えーっと、Swift2以前でstructをNotificationCenterに流せなかったときに
9:19 AM
class Box<T>って使いませんでした?まさにアレです (edited)
9:20 AM
これはコンパイラの中でboxingやってますよねということか
Avatar
そうそう
Avatar
わかり++
Avatar
値型はそのままだとメモリレイアウトも違うのでクラス型としての互換性はないので、AnyObjectへのキャスト時にラップするオブジェクトがいる。Swift3からコンパイラ側が勝手にBoxingしてくれるようになりました。
Avatar
omochimetaru 11/1/2017 9:20 AM
値型のオブジェクトを参照型のオブジェクトに包む事で、 JavaのListは、参照型しか格納できないので、 int とかが class Integer に包まれたりする ObjectiveC でも、 NSArray は参照型しか格納できないから、 NSValue で包む
Avatar
Java で intInteger
9:21 AM
って書いてたら @omochimetaru が。
Avatar
互換性のあるものだと、NSString, NSArray, NSDictionary, NSNumber, NSValue(もかな?)へ変換されて
9:21 AM
そうじゃないものは一括で、、SwiftValueなんすかね @omochimetaru @rintaro
Avatar
omochimetaru 11/1/2017 9:22 AM
ObjectiveCでは昔は [NSValue valueWithInt: 3] とかやってたけど、 iOS5ぐらいから @(5) って、アット丸括弧構文でboxingできるようになったとか、昔はあった
Avatar
昔の Java では↓みたいなことをしてて、 // Java List<Integer> list = new ArrayList<Integer>(); list.add(new Integer(42)); // boxing
Avatar
ははん
Avatar
omochimetaru 11/1/2017 9:22 AM
@tarunon これまでに見てきた感じだとSwiftの都合で必要になるやつは SwiftValueっぽいね
Avatar
今の Java はこれを自動でやってくれるから↓のように書けるけど( auto boxing )、あくまで自動なだけで boxing 自体は行われてます。 // Java List<Integer> list = new ArrayList<Integer>(); list.add(42); // auto boxing
9:23 AM
int に対して Integer をラッパークラスと言います。
Avatar
SwiftValueはObjcからは見えないSwiftに閉じた型の値?
Avatar
で、 Swift でも裏側で似たようなことをしているはずの部分を boxing と呼んでるけど、それが Java 由来なのか一般的な用語なのかは知りません。
👌 1
Avatar
SwiftValue、愚直に考えるならSwiftObjectのサブクラス
9:27 AM
SwiftObjectはNSObject互換で、動きを見る限りはサブクラスじゃないと思うけどObjective-C界から見たらNSObjectに見えそう。 (edited)
Avatar
SwiftValueとSwiftObjectは値型と参照型ってことではないのか、な
9:29 AM
サブクラスとのことだし
Avatar
さっきの C.self is AnyObject 問題があったから、 Swift の型システムとして表現したい世界と、 ObjC 互換のために現実的にどうなってるかとを区別して考えないといけないかも?
9:29 AM
おや、、、
Avatar
omochimetaru 11/1/2017 9:29 AM
struct S{} var s = S() print(type(of: s as AnyObject)) // _SwiftValue var f: () -> Int = { 33 } print(type(of: f as AnyObject)) // _SwiftValue ↑SwiftValueの例
9:30 AM
普段は見えないけど型名を動的に取得してprintすると出て来る。
Avatar
#if __OBJC__ @class _SwiftValue; #else typedef struct _SwiftValue _SwiftValue; #endif
Avatar
あー なんか見たことあると思ったらそれか
9:30 AM
こっちのほうが良さそう
9:30 AM
というか_SwiftValueはNSObjectのサブクラスじゃん
Avatar
なるほどー、 #if SWIFT_OBJC_INTEROP@interface _SwiftValue : NSObject <NSCopying> だから is AnyObject が Mac だと true になるんだ。 (edited)
9:33 AM
ん??
9:33 AM
それだと S.self でもそのはず?
Avatar
#swift じみてきた
Avatar
またわからんことがあったらここに書くのでまた教えてください
🙋 2
9:34 AM
ドラゴンは巣#swiftにおかえり
🍀 1
Avatar
少し話は戻りますが、JavaのListに参照型しか格納できないのってなんでですかね?
Avatar
omochimetaru 11/1/2017 9:36 AM
Genericsが型ごとに異なる実装を持てないからですね
Avatar
全部Objectとして持つのが前提じゃないかな
Avatar
omochimetaru 11/1/2017 9:37 AM
そうそう。List内部のストレージの実体が、ルートクラスのObjectの配列になってる。 (edited)
Avatar
つまり、Swiftっぽく示すと class List<T: AnyObject> {} これがJavaのListの定義
9:37 AM
本当はアブストラクトクラスだけど…
9:38 AM
後は型システムの制約とかあるはずだけど、そこは明るくないです。
Avatar
元々ジェネリクスもなくて、 class ArrayList { private Object[] elements; } こんな風になってたのを
9:38 AM
ジェネリクスを使って class ArrayList<E> { private E[] elements; } と書いているだけなので、
Avatar
omochimetaru 11/1/2017 9:39 AM
言語仕様としては、 int[] とか float[] みたいな、値型の配列も作れるんだけど、 List<int> のときにそれを内部で使わせる記法も仕組みもない あと、これは鶏卵だけど、ジェネリクスの型パラメータのところに値型が書けない・・・
Avatar
そもそも Java のジェネリクスが Object で持ってるのと同じです。コンパイル時に型チェックできるようになっただけで、実行時の挙動はジェネリクス以前と同じで Object です。
Avatar
Erasure ですからねぇ
Avatar
ジェネリクス以前の実装は参照型なら任意の型が入りうる感じですか?
Avatar
確か Java でも値型とか List<int> を導入する話が出てたような?
Avatar
なんか出来るようにするけどいつになるだろうみたいなのを聞きましたね
Avatar
@Yuta Saito そうです。 < ジェネリクス以前の実装は参照型なら任意の型が入りうる感じですか?
Avatar
危険だ。。。
Avatar
ListList<Object> と書いてるのと同じですね。
Avatar
omochimetaru 11/1/2017 9:42 AM
Javaコンパイラのその振る舞いをするモジュールが type erasure って名前 https://docs.oracle.com/javase/tutorial/java/generics/erasure.html
Avatar
omochimetaru 11/1/2017 9:42 AM
To implement generics, the Java compiler applies type erasure to:
Avatar
Javaのジェネリクスは後付け仕様で、コンパイル時のエラーチェックしかできないから、ジェネリクス使ってたとしても、明示的にキャストすれば任意の参照型が入った気がします。
Avatar
Obj-C はつい最近までそういう状態でした。 < 危険だ。。。
Avatar
omochimetaru 11/1/2017 9:43 AM
危険だ。。。
AndroidがJava6を書いているころ、iOSでは NSMutableArray に ジェネリクスも何もなくやってたね
Avatar
全部 id 型
Avatar
@hironytic
明示的にキャストすれば任意の参照型が入った気がします。
そんな気もしたんですが、キャストでエラーになるような気もして自信が持てず・・・。
Avatar
omochimetaru 11/1/2017 9:44 AM
明示的にキャストすれば任意の参照型が入った気がします。
List<Integer> a = new ArrayList<Integer>(); List<String> s = (List<String>)(List<Object>)a;
😩 1
9:44 AM
たしかこんな感じのダブルキャストするとコンパイルできる
Avatar
さてここで
Avatar
omochimetaru 11/1/2017 9:45 AM
実行時に add した瞬間に runtime exception だった気がする。
Avatar
僕が [Int]() as? [String] これを嫌がる理由が
9:45 AM
runtime exceptionではないけどじゃばみを感じる
Avatar
Java だと↓のようなオーバーロードもできなかったはず。 int foo(List<Integer> list) { ... } int foo(List<Double> list) { ... }
Avatar
#java
Avatar
どちらも List なので。
Avatar
omochimetaru 11/1/2017 9:47 AM
できないですね、それがtype erasureの仕事・・・
Avatar
Kotlin とかもその制約を受けてて辛い。
Avatar
omochimetaru 11/1/2017 9:48 AM
コンパイル時にジェネリックパラメータについての型チェックができる、はそうなんだけど、型システムのかなり前段で行われちゃうんですよね (edited)
9:48 AM
Java5からJava4に型検査+ダウントランスパイルしてから実際のコンパイルするような感じ。
Avatar
うん、そんなイメージ。
Avatar
そうですね
Avatar
たしかにキャストでエラーになりますね。。。
Avatar
@omochimetaru ownershipっていつ入るんですか Swift5?
Avatar
omochimetaru 11/2/2017 5:02 AM
swift-evolution - This maintains proposals for changes and user-visible enhancements to the Swift Programming Language.
5:02 AM
Swift5でやりたい事がここにかいてあって
Avatar
5.0か
5:03 AM
1年後か
Avatar
omochimetaru 11/2/2017 5:03 AM
Swift5の大きなテーマがABIなので、Ownershipもそれに引っ張られてABIに関するやつはやるぞって書いてある
5:03 AM
Memory ownership model. An (opt-in) Cyclone/Rust-inspired memory ownership model is strongly desirable for systems programming and for other high-performance applications that require predictable and deterministic performance. Part of this model was introduced in Swift 4 when we began to enforce exclusive access to memory. In Swift 5 our goal is to tackle the pieces of the ownership model that are key to ABI stability.
5:03 AM
pieces of the ownership model that are key to ABI stability.
5:04 AM
ABI安定性のカギとなるオーナーシップの一部分
Avatar
ABIの規格にownershipも含めとかないとってことか
Avatar
omochimetaru 11/2/2017 5:04 AM
ですね ABIは関数呼び出し仕様も絡むので
5:04 AM
shared引数ってどういう呼び出しになるのか、とか芋づる式に決めないといけない
Avatar
ふむふむ
5:05 AM
Rust-inspiredってことは今のうちにRustのownershipと戯れておくのは無意味じゃないってことでいいんでしょうか
Avatar
omochimetaru 11/2/2017 5:06 AM
むしろRustやっておくと楽勝だと思う
Avatar
ナルホディウス
Avatar
omochimetaru 11/2/2017 5:06 AM
Rustよりちょっと小さい仕様で入れようぜって感じだから。
5:06 AM
Rustの機能全部パクると使いにくくなっちゃうからSwiftでは使いやすさと安全性の両立できるラインにとどめようという方針
Avatar
Rust、ドキュメント一通り読んでサンプル動かして脳内インデックス作ったつもりだったけど全然難解すぎて脳が育たない
Avatar
ジェネリクスと関連型が同時に存在するところわからない
Avatar
Genericsと associatedType
Avatar
rustのGenerics protocolなら前に議論があった (edited)
Avatar
rust の type と Generics の話ですね @lovee
Avatar
失礼しました🙃
👌 1
Avatar
UITableViewCellを再利用するとき、styleがdefault以外の場合、皆さんどうしてますか? ① UITableViewCellのサブクラスをつくって、UITableViewにregisterする ② iOS6以前の方式で書く let cell = tableView.dequeueReusableCell(withIdentifier: "hogeCell", for: indexPath) ?? UITableViewCell(style: .subtitle, reuseIdentifier: "hogeCell") ③ その他 ただstyleが違うだけなのにイニシャライザだけ定義した、UITableViewCellのサブクラスつくるのが面倒なので良い方法があったりしないかな…と思った感じです。 (edited)
Avatar
Kishikawa Katsumi 11/7/2017 3:25 AM
よほどのことがなければ1がテッパンですね。
Avatar
やっぱりそうですか。
Avatar
omochimetaru 11/7/2017 3:26 AM
サブクラス作るのが面倒な時、サブクラス作るのが面倒な言語仕様がおかしいんだ!って気持ちを高めて頑張ってサブクラス書いてます。(そこで楽しようとすると型的に面倒な事があとあと起きてきがち (edited)
Avatar
Kishikawa Katsumi 11/7/2017 3:27 AM
ただstyleが違うだけなのにイニシャライザだけ定義した、UITableViewCellのサブクラス という気持ちはわかりますが、それで済むのはほんの最初のうちなので、結局セルの種類ごとにクラスで名前をつけるのがわかりやすいです。
3:27 AM
同じスタイルでも違う種類のセルなら違う名前のクラスにしたほうがいいです。
Avatar
納得、ありがとうございます!
Avatar
Kishikawa Katsumi 11/7/2017 3:30 AM
ちなみに indexPath を2番目の引数に取る dequeueReusableCell() はnilを返さないので、2の書き方はindexPath を取らない方のメソッドを呼ぶ必要があります。細かいツッコミですけど。
😱 1
Avatar
あ、そうですね、適当すぎました
Avatar
前のxcodeだとlinked frameworkで入ったフレームワークを左ペインでグループにまとめるとかしてましたけど 今のバージョンだとグループ作ってD&Dで移動すると実体が移動してしまう気がしてます。(New Group, New Group without Folder問わず) 何か方法あるんでしょうか?
Avatar
omochimetaru 11/9/2017 8:15 AM
わかる・・・俺諦めた。しまいたい。
😢 1
Avatar
norio_nomura 11/9/2017 8:38 AM
プロジェクトの直下に入ってしまう件?
Avatar
omochimetaru 11/9/2017 8:38 AM
直下に入ってしまって、それを、グループを作ってグループの中に隠そうとしても
8:38 AM
うまくいかない。
Avatar
norio_nomura 11/9/2017 8:40 AM
Embedded Binariesにいきなり入れると直下に置かれるけど、Linked Frameworks and Librariesに入れるとFrameworksの下に参照が作られるから、それをEmbedded~へ入れる様にしてる。
Avatar
omochimetaru 11/9/2017 8:41 AM
今度試してみます。
Avatar
Linked Frameworks and Librariesの+からやるとFrameworksってグループができてその下に入るんですね。これで耐えられそうです。ありがとうございます。
🎉 1
Avatar
Dictionaryのキーを変換して [Int: Any][String: Any] にしたいみたいなときってどう書くのが一番綺麗なんでしょう
Avatar
let source = [1: "1", 2: "2", 3: "3"] Dictionary(uniqueKeysWithValues: source.map { ("\($0.key)", $0.value) }) こう?
Avatar
おっ ためしてみる
Avatar
おそらく初歩な内容だと思われるのですが、質問させていただきます。 1. ボタンを押す 2. 「ダウンロード中」というUILabelをつけたUIViewを表示させる 3. ダウンロードタスクが始まる 4. そのダウンロードタスクが終了したときにUIViewを削除する という処理を行う場合、どのように書けばよいのでしょうか? 現在、以下のように書いているのですが、 @IBAction func tapDownloadButton(){ let uiView = UIView(frame: CGRect(x:0,y:0, width:100, height:100)) uiView.backgroundColor = UIColor.white self.view.addSubview(uiView) //このタイミングでビューを表示したいができない download() uiView.removeFromSuperView() } ボタンに紐づけられた関数tapDownloadButton()の処理が全て終わったタイミングでUIの処理が始まるためか、見た目上、UIViewが表示されずにダウンロードが終わってしまいます・・・
Avatar
Kishikawa Katsumi 11/18/2017 9:25 AM
@TetsuFe 期待した通りに動かない理由はお書きになった通りです。UIが更新されるためにはイベントループに処理を戻す必要があるので、一連のメソッドの間でaddSubview(_:)removeFromSuperView()をしてしまうと、結果としてビューが外された最後の状態でUIが更新されます。
9:27 AM
download()は同期的な処理ですか?最も望ましいと思われる解決はdownload()メソッドを非同期処理にして完了時点でコールバックを受け取れるようにして、addSubview(_:) を呼んでからdownload()、ここまでは同じで、removeFromSuperView()をダウンロード完了のコールバック内で呼ぶことです。
9:28 AM
それが難しければ、addSubview(_:)の直後に一度イベントループに処理を戻してUIを更新して、download()removeFromSuperView()を呼びます。
9:32 AM
view.addSubview(uiView) DispatchQueue.main.async { self.download() uiView.removeFromSuperView() }
9:33 AM
後者の方法はこんな感じですね。簡単ですけど良いコードではないのでオススメしませんが、元のコードがなぜ期待した通りに動かなかったのかはよくわかると思います。
Avatar
ありがとうございます。 丁寧な説明でとても助かりました。 downloadを非同期的な処理に変えてコールバックでremoveFromSuperViewを実行することで、期待通りの挙動になりました。 後者の方法は、なぜかうまくいきませんでしたが、これはダウンロードを行う関数が同期処理になっているためでしょうか?
Avatar
download関数がダウンロード処理を実行し即座にVoidを返すためだと思います
12:54 AM
処理の進捗や結果如何に関わらず、実行の次にreturn Voidですね
Avatar
@tarunon ありがとうございます。 なるほど、そういうことだとすると、納得できます。 まだ理解が追いついていないですが、結果的にどういう流れになっているかは分かりました。もっと勉強しないといけないですね。
Avatar
それぞれ別のassociatedtypeを持つprotocol A, B に適合したprotocol Cを作成した場合についての質問です。 protocol A, BそれぞれのassociatedtypeのTypeは同一なので、 struct適合時にはどちらか一つのみtypealiasを定義したいです。 しかし、protocol Cにてwhereで条件を書いても どちらか一方のprotocolに適合していないとコンパイルエラーが出てしまいます。。 この場合、何か策はあるのでしょうか? protocol A { associatedtype TypeA } protocol B { associatedtype TypeB } protocol C: A, B where TypeA == TypeB { } struct Hoge: C { // error: type 'Hoge' does not conform to protocol 'A' typealias Type2 = String }
Avatar
struct Hoge: C { typealias TypeA = String typealias TypeB = String } これなら通りますね。TypeAとTypeBが別々だと通らなくなるので同一チェックもされてるようです。
Avatar
そうですね、ただTypeAとTypeBを毎度同じ型を定義するのがしんどいので protocol Cを定義してTypeA == TypeBであることを担保しておき、C適合時にはどちらかのみ書けばいい状態にしたいです
Avatar
うーん、両方書かないと通らないですね。一応、実用的には↓のように何らかのメソッドがあると思うので、明示的に typealias を書かなくてもコンパイルは通ります。 protocol A { associatedtype TypeA func foo() -> TypeA } protocol B { associatedtype TypeB func bar() -> TypeB } protocol C: A, B where TypeA == TypeB { } struct Hoge: C { func foo() -> Int { return 2 } func bar() -> Int { return 3 } }
Avatar
protocol A { associatedtype TypeA } protocol B { associatedtype TypeB } protocol C: A, B { associatedtype TypeB = TypeA } struct Hoge: C { typealias TypeA = String }
Avatar
assoctypeの上書きできるんですね……
Avatar
where句を書くのはextension、protocolはassociatedtypeに制約を記述します
Avatar
おお、 C のそこ associatedtype になるんですね。 typealias で書いてエラーになってあきらめてました。
Avatar
同じく
Avatar
@t.ae そろそろRecursive Constraintsも来るので色々出来るようになりますよ
Avatar
レベル高い
Avatar
なるほど!
Avatar
個人的には逆をやりたいのですが出来なくて困っています
3:27 AM
protocol A { associatedtype E } protocol B { associatedtype E } struct C: A, B { typealias A.E = Int typealias B.E = String } これはどうあがいてもムリです。 (edited)
Avatar
associatedtypeで制約を書けばよかったんですね・・ @t.ae#5802 @koher @tarunon ありがとうございます!
Avatar
associatedtypeの 名前が かぶっちゃいけないってこと?
Avatar
associatedtypeの名前がかぶると同じ型にしかならない
3:28 AM
ネームスペース気にしなきゃいけなくなって苦痛
Avatar
わかる
Avatar
それひどい仕様ですね・・・。
Avatar
古き良きベンダープリフィクス
Avatar
プロトコルつくるときにはローカルな名前つけたいんだけど、あっちのあれとぶつかるかも、みたいな。
Avatar
Shitだ
Avatar
HogeProtocol.FugaAssocType みたいな書き方ができれば解決?
Avatar
そのあたりってどういう整理なんでしょう?たまたまそういう実装になってる?or意図的な仕様?
Avatar
#swift でよさそう
Avatar
#ios#beginner-help_archived か迷ったのですが、こっちで質問してみます iOS11のみで起きる CFNetwork URLResponse::guessMIMETypeCurrent(__CFData const*) のバグに苦しめられてまして、どなたか同じような現象に出くわした方いらっしゃいませんか。 MIMETypeについてなので、URLResponseをNSHTTPURLResponseにキャストしてMIMETypeの中身を見てるんですが、たまにnullが返ってくるのが問題かなと思ったのですが、iOS10や9でもnullで返ってくるので、特にこれが原因でクラッシュするわけではないような…。 ググっても同じような問題に悩んでいる人が見つからなかった…。 Crashed: com.apple.NSURLSession-work SIGABRT ABORT 0x0000000180ded348 -------------------------------------------- libsystem_kernel.dylib __pthread_kill + 8 CoreFoundation _CFRelease + 1252 CFNetwork URLResponse::guessMIMETypeCurrent(__CFData const*) + 1548 CFNetwork -[__NSCFURLLocalSessionConnection _tick_sniffNow] + 348 libsystem_pthread.dylib start_wqthread + 4
Avatar
コードが欲しい…
Avatar
ですよね
7:28 AM
しばしお待ちを
Avatar
objcのコードで辛い感じですが、マルチパートを自作してPOSTするメソッドです。
3.59 KB
Avatar
``` でくくってここに貼れませんか?
Avatar
それが長すぎて
Avatar
ならgistとかのほうがみんな見やすいと思います
Avatar
投稿できなかったのファイルになりました
7:41 AM
あ、確かに
Avatar
objcをシンタックスハイライトなしで見るのは大変なのでw (edited)
Avatar
すみません,
🙆 1
7:43 AM
これでどうでしょうか。
Avatar
どこでクラッシュしてるんだろ
7:46 AM
(objcだと思ってなかったw)
😭 1
Avatar
Kishikawa Katsumi 11/22/2017 7:46 AM
コードは問題ないように見えます。
Avatar
ちょっとわかんないですけど、構築してるリクエストに何かしらの問題があって、NSURL系のドライバが内部で死んじゃうんだと予想します
Avatar
レビューありがとうございます。たぶん、なんですがcrashlyticsにログは来てますが、クラッシュしてるわけではないようなんですが、iOS11のみログが送られてきてまして
Avatar
Content-Type: が multipart/form-data; のときって、 charset は要らないようなきがするのと
7:48 AM
Content-Length: が無いのが気になるけど
7:48 AM
クラッシュしちゃうほどのことでも無さそう・・・
7:49 AM
Content-Length: は NSURLRequestが勝手に付け足す気もするな。HTTPBodyに入れてるのがNSDataだし。うーん、なんだろう・・・
Avatar
なるほど、ちょっとそこを変更してみると、「構築してるリクエストに何かしらの問題があって、NSURL系のドライバが内部で死んじゃう」可能性を想定してもう一度コードを見てみます
7:50 AM
ありがとうございます
Avatar
Kishikawa Katsumi 11/22/2017 7:50 AM
guessMIMETypeCurrent だからContent-Typeを付け足してみて試すとか。
Avatar
あ、ほんとだ、含めてるオブジェクトの方が無いですね15行目あたり
7:51 AM
26行目のほうはContent-Typeついてるけど、こっちは画像添付で別フローだ。
Avatar
むむ
Avatar
Kishikawa Katsumi 11/22/2017 7:51 AM
再現できないと難しいので、再現方法を探りつつ、クラッシュがそれほど多くないのであれば、勘で色々な対策を通常のアップデートに紛れて入れていくくらいしか思いつかないですね。
Avatar
あ、いや、いいのか。こっちはFORM VALUEなのか
7:52 AM
https://stackoverflow.com/questions/4526273/what-does-enctype-multipart-form-data-mean POST / HTTP/1.1 [[ Less interesting headers ... ]] Content-Type: multipart/form-data; boundary=---------------------------735323031399963166993862150 Content-Length: 834 -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="text1" text default -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="text2" aωb -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="file1"; filename="a.txt" Content-Type: text/plain Content of a.txt. -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="file2"; filename="a.html" Content-Type: text/html <!DOCTYPE html><title>Content of a.html.</title> -----------------------------735323031399963166993862150 Content-Disposition: form-data; name="file3"; filename="binary" Content-Type: application/octet-stream aωb -----------------------------735323031399963166993862150--
What does enctype='multipart/form-data' mean in an HTML form and when should we use it?
Avatar
Kishikawa Katsumi 11/22/2017 7:52 AM
if (image){ のとこではContent-Type指定してあるんですね。
Avatar
↑のstackoverflowにMIMEなリクエストの例が載ってて、それと見比べてたんですけど、怪しいところみつけられず。
Avatar
みなさんの意見参考に、もうちょっと再現方法を探りつつ頑張ってみます。
Avatar
100%クラッシュなのであれば (edited)
Avatar
そこまで大きくないバグですが、iOS11のユーザーが増えつつあるので、気になる数にはなっています
Avatar
MIMEリクエストを行う他のライブラリをいくつかためしてみて
7:56 AM
自前実装では問題が起きて、他のライブラリなら大丈夫、ってところまでいければ
7:56 AM
実際に飛ばしてるリクエストを見比べて絞りこめると思います
7:57 AM
HTTPリクエスト内容とは全然違う制御系の部分のバグだったらダメですけど・・・ (edited)
Avatar
100%じゃないと真っ先にスレッド周り疑いたくなりますね
7:57 AM
非同期のタイミングで落ちる系のやつ
Avatar
なるほど・・・ライブラリと比べるのも手ですね
Avatar
100%ではないにしろSIGABORTなのでアプリクラッシュは起きてそう。
Avatar
そもそもの話になってしまうのですが、 CFNetwork -[__NSCFURLLocalSessionConnection _tick_sniffNow] + 348 でNSのプレフィックスが付いているのでobjcから呼ばれた通信でバグっているのはあっているのでしょうか?
8:00 AM
このメソッドは廃止予定のものなのですが、まだSwiftに置き換えられてないといった状況でして
Avatar
CoreFoundation _CFRelease + 1252 こっちじゃないかなあ
Avatar
Swiftから呼ばれていたとしても、内部は __NSCFURL... とかが動いてると思うんで
8:00 AM
ObjCから呼ばれてる通信が原因とは限らないかと。
Avatar
むーそうですか・・・。
Avatar
CFReleaseで落ちるってことはオーバーリリースだと思うので
Avatar
ObjcとSwiftが混在してるプロジェクトなのかな?
Avatar
生きてないといけないオブジェクトがリクエストの稼働中に消えちゃってるんじゃないだろうか
Avatar
オーバーリリースというのがあるのか
Avatar
リクエストではなくレスポンスに問題あるのでは?
Avatar
そうです、objcとSwiftが今のところ5:5てきな感じです
8:02 AM
生きてないといけないオブジェクトがリクエストの稼働中に消えちゃってるんじゃないだろうか
Avatar
@omochimetaru そのオーバーリリースってARCの環境でも起きるもんなんスカ
Avatar
むー、問題の特定が難しい
Avatar
@hiragram Swiftだとweakがあるから大丈夫だけど昔の ObjC だと弱参照じゃなくて生ポインタだから、Delegateがもう死んじゃってるとよくおきた
Avatar
CF某は自分でやってなかったっけ、あれはもうなくなった?
Avatar
After you create a task, you start it by calling its resume method. The session then maintains a strong reference to the task until the request finishes or fails; you do not need to maintain a reference to the task unless it is useful to do so for your app’s internal bookkeeping purposes. 大丈夫そうだなあ・・・
Avatar
Kishikawa Katsumi 11/22/2017 8:05 AM
確かにレスポンスの問題っぽいですよね。
Avatar
@omochimetaru オーバーリリースっていうとretain countが0なのにreleaseしようとしたっぽい感じに聞こえたけど、実際は解放済みのメモリにアクセスしたから落ちたってことかしら
Avatar
NSURLProtocol実装してたりします?
Avatar
@hiragram そうだね。実際は解放済みメモリへのアクセスが起きる。
🆗 1
Avatar
NSURLProtocolはつかってないです
8:07 AM
レスポンスの問題だとサーバー側にも何か原因があったりするのでしょうか
Avatar
Kishikawa Katsumi 11/22/2017 8:08 AM
コードは問題なさそうですし、100%起こらないというのもそれなら納得できるし、クラッシュのメソッドはURLResponseというオブジェクトのメソッドなので、何かレスポンスの処理なんでしょう。
8:09 AM
CFNetworkのコードを探したけどそのメソッドは見つかりませんでした。CFNetwork外か新しく追加されたものか。
Avatar
特に、responseに関しては、statusCodeを見るぐらいにしか使用していないつもりなのですが・・・。どこかでつかってるのかな。
Avatar
Kishikawa Katsumi 11/22/2017 8:09 AM
あ、いや、レスポンスの内容です。サーバーから返ってくるレスポンスのデータ。
Avatar
あ、なるほど
Avatar
再現性ないとなると、レスポンスデータのロード中の read の区切れ具合で運が悪いとクラッシュしたりとかありそう。
Avatar
雲をつかむような質問を投げてしまった。みなさんありがとうございます。もうちょっと色々、探ってみます。
Avatar
まあ逆に尻尾つかめたときには質問することはなくなってますからねだいたいw
Avatar
確かにw
Avatar
Kishikawa Katsumi 11/22/2017 8:15 AM
あ、場所がわかってるということなら、クラッシュレポートに、ここのコードに送信してる内容のログを含めるようにしたら再現に役立ちませんかね。レスポンスが動的だったらあまり意味はないかもしれませんが。
Avatar
ユーザーから、通信が切れるから困るみたいな問い合わせが増えてるわけではないので、本当にこのバグは起きているのか少し疑問でもあります。
Avatar
多分ですけどNSURLSessionのinternalで起きていてどのreq/resかすら掴めないのでは
Avatar
いい機会と捉えてSwiftに書き換えてみては
Avatar
Contribute to iOS9-SpringBoard-Headers development by creating an account on GitHub.
Avatar
なんかワーカースレッドがタスク探してディスパッチしそうなメソッド名だよね
Avatar
あ、すでに同じメソッドをSwiftに置き換えているのですが、最初のログでNSのプレフィックスがついてたから、objcの古いコードから起きてるのかなと、勝手に予測してしまいました。
Avatar
なるほど
Avatar
問題のありそうなところに、詳細なログを送るように色々しこんでみるしかないですね
Avatar
Crashlyticsのレポートってアプリのバージョンがいくつかって含まれてなかったでしたっけ
Avatar
含まれてまして、iOS11に対応したときから、このバグが出現しはじめてまして
8:22 AM
iOS11にアップデートしたユーザーが増えるにつれて、少しづつバグの件数が増加している感じです、まだそこまで多くないのですが。
Avatar
レポートが上がってきているバージョンのアプリは、上述のobjcからswiftへの置き換えをする前のものですか?
8:23 AM
kuroさんがおっしゃっているバージョンというのはiOSのバージョンのことかな・・
Avatar
あ、すみません。段階的にobjcからSwiftに移行してまして、iOS11に対応してバージョンのときぐらいに、このバグがで始めたと言った感じです。
8:26 AM
NSURLSessionのinternalで起きていてどのreq/resかすら掴めないのでは
8:27 AM
これもそのとおりで、どのリクエストでこのバグが起きているのか特定できていないので、通信するクラスに詳細なログを取れるようになにか手を打って、バグの再現に努めます
Avatar
1 はじめに Burp Suiteは、Webの脆弱性診断を行う製品です。 XSSや、その他の脆弱性であるreflectedやstoredのDOMベースの検査パターンを有しています。 今回は、この製品の機能のうちの一つであ […]
8:27 AM
↑こういうのを使って
8:27 AM
できるかわからないけど、リクエスト、レスポンスを、
8:28 AM
一個ずつ時間をあけてしか通さないようにプロキシを設定できれば
8:28 AM
落ちたときに、飛んでいたレスポンスが、捕捉できるかも。
Avatar
https://qiita.com/hiragram/items/195c7117fb6ebd50653e Charlesなら通信にブレークポイントを貼れますぞ〜!
この記事はSpeee Advent Calendar 2日目の記事です。 前日の記事はこちら [Ruby力を高めるためには標準メソッドを学べ...
Avatar
Burpでの通信の監視自体はやったことがあって、結構よかったです。
Avatar
手元で再現できてないと使えないのでは
Avatar
手元で再現できてないと使えないのでは
それはそう
Avatar
CharlesとBurpちょっとためして、手当たりしだい見てみます
8:29 AM
ありがとうございます
Avatar
URLSessionから実行中のtask一覧取り出せるけどあれは非同期だからクラッシュ時に埋め込むのは無理かなぁ
Avatar
URLSessionから実行中のtask一覧取り出せる
8:32 AM
知らなかったです、それも試してみます
8:32 AM
ありがとうございます
8:37 AM
大掛かりだけど、自前で実行中のreqをリストで持てるように改修して、クラッシュ時に全部取ってくるようにするのが確実な気がしますね。急がば回れです (edited)
8:37 AM
非同期でリストいじって死なないようにだけ注意しないとダメですけど
Avatar
なるほど・・・それを仕込んでリリースしてリクエストの特定をするのがまずは先な感じがしてきました。実装が大変そうですが、トライしてみます。
Avatar
サーバー側のログと照らし合わせて特定とか出来ないかな?
8:43 AM
もし可能ならそっちは今すぐ出来るかもしれない。 (edited)
Avatar
たしかに、iOS内でしかまだ問題を共有してなかったので、レスポンスが問題ならサーバー側のログにも当たってみます
Avatar
UIImage の↓の二つのプロパティは、ドキュメントを素直に読めば片方が nil のときはもう片方は nil でないということになると思うんですが、それは保証されているんでしょうか? var cgImage: CGImage? { get }
If the UIImage object was initialized using a CIImage object, the value of the property is NULL.
https://developer.apple.com/documentation/uikit/uiimage/1624147-cgimage var ciImage: CIImage? { get }
If the UIImage object was initialized using a CGImage, the value of the property is nil.
https://developer.apple.com/documentation/uikit/uiimage/1624129-ciimage
4:16 PM
たとえば、↓のようなコードは正当な(決して ! に失敗しない)んでしょうか?より良い書き方がありますか? if let cgImage = uiImage.cgImage { // `cgImage` を使う処理 } else { let ciImage = uiImage.ciImage! // forced unwrap // `ciImage` を使う処理 } (edited)
Avatar
if let ... else if let ... else fatalErrorの方が良さそう
Avatar
bannzai