2017年9月20日水曜日

Swift 4リリース

Xcode 9でさっそくSwift 4がリリースされた。
2.x → 3 ほどの大きな変更はないと思うが、気付いた点があったら追記していく。

@objc推論の廃止

Dependency Analysis Warning
The use of Swift 3 @objc inference in Swift 4 mode is deprecated. Please address deprecated @objc inference warnings, test your code with “Use of deprecated Swift 3 @objc inference” logging enabled, and then disable inference by changing the "Swift 3 @objc Inference" build setting to "Default" for the "アプリ名" target. 
Swift 4モードでのSwift 3 @objc推論の使用は廃止されました。
推奨されない@objcの推論のWarningに対処し、「廃止されたSwift 3 @objc推論の使用」ロギングを有効にしてコードをテストし、 「アプリ名」 targetの 「Swift 3 @objc Inference」ビルド設定を 「Default」にしてください。

——Swift 3で作ったコードを開いたら出た。よくわからんのだけど、Objective-CのクラスとかをSwiftで扱う時に型を推定してくれてたのかな? んで、それが廃止になって、型変換とかを自分で明示的にやれ…とかそんな意味か?
別にObjective-Cのコードとか使ってなかったけど、Xcode 8でデフォルトでそういう設定だったんだろう。それなら自動で直してくれりゃいいのに。グチグチ。
ここをDefaultに変えるとWarningが消える
Build Setting、TARGETSにはアプリ名とアプリ名+Testsの二つがあるが、その両方にSwift 3  @objc inferenceの設定があるので、両方変えてやる必要がある。

#selectorの書き方?

Timer.scheduledTimer(timeInterval: 0.5,
                  target: self,
                selector: #selector(IdleEvents.filterUpdate(timer:)),
                userInfo: nil,
                 repeats: true)

こういうコードをSwift 3で書いてたんだけど、#selectorのところに以下のエラーが。
2番目のエラーにはFixってボタンが出るんでそれを押すと消えるんだけど、一時的なものらしく、また出たり、@objcってのをコード中の変なところに挿入されたり、なんだかよくわからん!
Argument of '#selector' refers to instance method 'filterUpdate(timer:)' that is not exposed to Objective-C
Add '@objc' to expose this instance method to Objective-C

どうやら、#selectorで呼び出す関数、メソッドの頭に「@objc」ということらしい。
@objc func hogehoge() { … }

んで、そんなこんなやってたら自作のクラスにExpected declarationというエラーが出るようになった。
調べたらコードの最後に「@objc」が付けられてた。さっきのFixボタンがいい加減なところに挿入しやがったんだな。

'NSFontAttributeName' has been renamed to 'NSAttributedStringKey.font'

Replace 'NSFontAttributeName' with 'NSAttributedStringKey.font'

'NSForegroundColorAttributeName' has been renamed to 'NSAttributedStringKey.foregroundColor'

Replace 'NSForegroundColorAttributeName' with 'NSAttributedStringKey.foregroundColor'

'NSShadowAttributeName' has been renamed to 'NSAttributedStringKey.shadow'

Replace 'NSShadowAttributeName' with 'NSAttributedStringKey.shadow'

0 件のコメント:

コメントを投稿