久しぶりの投稿です。
最近あまりSwiftを書く時間を取れておらず、やっと書ける〜と思ってビルドしたらこの有り様(46 issues)です。
もう作るのやめようかと思いました。
お話すること
今回はSwift1.2へのアップデートによって自分がビルドで引っかかっていた部分を中心に記述します。
- Swiftがアップデートされてましたよ(1.1 => 1.2)
- キャストの仕様変更
- NSStringをStringで扱う場合にキャストが必要になった
詳しくはApple公式のSwiftブログやRay Wenderlichの記事をご覧ください。
Ray Wenderlichのほうが当該記事以外にもチュートリアルなども揃っており個人的には好きです。
一言で言っちゃえば
「アップデートを追うっていう意味でもちゃんと定期的にコードに触れておきましょうね」
という話ではあるんですが、まぁそれだとここに残すまでもないので・・・笑
Swiftがアップデートされてましたよ(1.1 => 1.2)
2015年2月にSwiftは1.1から1.2にアップデートされていました。
Xcode6.3にアップデートした際に勝手に入ってくるはずです。
生まれたての言語ということもあり、まだまだ変更は多いですよね。
以下に挙げるものが目立ったアップデートです。
- コンパイルのスピードアップ
- オプショナルバインディングが書きやすくなった(何重ものネスト化を防げる)
- キャスト時に
as!
またはas?
を使うように義務付けられた - ArrayやDictionary型に似たSetなる型が登場
- let(定数型)の値が宣言時に用意しなくてもよくなった
- SwiftとObjective-Cの型互換解除(Swift1.1までの書き方だとNSStringがStringと認識されない)
キャストの仕様変更(as => as! OR as?)
前項でキャスト時に as! または as? を使うように義務付けられた
と挙げたものです。
これまでのSwift(<=1.1)ではキャストするときにこんな書き方でも良かったわけです。
var object: AnyObject = "hoge"
var string = object as String
これがSwift 1.2だとこれがコンパイルエラー起こして見事に最初の画像が出来上がります。
ではどう書くか?
// Forced failable
var object: AnyObject = "hoge"
var string = object as! String
// Optional
var object2: AnyObject = "fuga"
var string2 = object2 as? String
どうキャストするのかを!
もしくは?
を使ってきちんと定義する必要があるわけですね。
疑問:僕は引っかかったエラーを地道に直していたのですが、Xcodeで一気にまとめて変更する方法ってあるんですかね?
NSStringをStringで扱う場合にキャストが必要になった
SwiftとObjective-Cの型互換解除(Swift1.1までの書き方だとNSStringがStringと認識されない)
。
早いところSwiftもObjective-Cに頼らないネイティブSwiftとしてのメインストリームを歩んでいきたいわけです。
僕はSwityJSONを扱っていてこのエラーに当たりました。
Swift Compiler Error: 'NSString?' is not convertible to 'String'
Stringにキャストしてあげることでエラーは取れます。
逆にSwiftからNSStringに値を代入するときはキャストはいらないらしいです。
まとめ
-
キャストのasは
!
または?
を添えてしっかり定義すること
(定義を明確にすることでチーム開発にはありがたいですよね) -
NSStringをStringで扱うときはキャストを忘れずに
-
アップデートを追うっていう意味でもちゃんと定期的にコードに触れておきましょうね
仕事でXcode(Objective-C)をビルドすることはあるんですが、
Swiftへの移行はまだなのでキャッチアップできていなかったことに反省。。。