LoginSignup
4
4

More than 5 years have passed since last update.

Swift1.2のアップデートを備忘録的にまとめる - コンパイルエラー祭りからの脱出

Last updated at Posted at 2015-05-31

久しぶりの投稿です。
最近あまりSwiftを書く時間を取れておらず、やっと書ける〜と思ってビルドしたらこの有り様(46 issues)です。
もう作るのやめようかと思いました。

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'

Screen Shot 2015-05-31 at 14.12.24.png

Stringにキャストしてあげることでエラーは取れます。

Screen Shot 2015-05-31 at 14.12.42.png

逆にSwiftからNSStringに値を代入するときはキャストはいらないらしいです。

まとめ

  • キャストのasは!または?を添えてしっかり定義すること
    (定義を明確にすることでチーム開発にはありがたいですよね)

  • NSStringをStringで扱うときはキャストを忘れずに

  • アップデートを追うっていう意味でもちゃんと定期的にコードに触れておきましょうね

仕事でXcode(Objective-C)をビルドすることはあるんですが、
Swiftへの移行はまだなのでキャッチアップできていなかったことに反省。。。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4