Xcode
iOS
Swift

仕様変更【 Swift1.2 / Xcode6.3】まとめ

More than 3 years have passed since last update.


はじめに

以前、アプリ開発をしている最中に、

Xcodeを 6.2 -> 6.3

Swiftを 1.1 -> 1.2

にバージョンアップしました。

それに伴い、

エラーが大量発生してしまいましたが、

Xcodeの補完機能(エラーが起きたときにたまに出る赤色の◯マーク

を使用したため、

当時は無事ビルドさせることができました。

しかし、

それだと分かった気持ちで開発していると感じたため、

今回主な変更箇所を調べてまとめてみました。


変更箇所 Swift


1. キャストの仕様変更

・新しくas!演算子が出来たため、

asas!またはas?で記述しなければなりません。


実行時に失敗する可能性のあるキャストはas!という新しい演算子をつける


・今までasと記述していた箇所はas!に変更すればエラーが消えます。

もっと詳しく

メモ:

ダウンキャストとは

Optional型とは


2. NSStringをStringで扱う場合はキャストしなければならない


なんだかんだいってSwiftもObjective-Cに頼らないネイティブSwiftとしてのメインストリームを歩んでいきたいわけです


NSStringの変数Stringの変数に代入する場合はas Stringでキャスト(型変換)する必要があります。

Stringの変数NSStringの変数に代入する場合はキャスト(型変換)する必要はありません。

例)

var nsstr:NSString = "文字列"

var str:String = nsstr
nsstr = str

↓ as Stringを追加する

var nsstr:NSString = "文字列"

var str:String = nsstr as String
nsstr = str

メモ:

NSStringとStringの違い


3. 定数 letの強化


3.1 条件分岐によりletを初期化することができる

定数 letは、

生成時に直接初期化しなくても良いことになりました。

これまで、

条件分岐によって初期化させたい場合は、

変数 varを使用してきました。

その後その変数の中身を変更しない場合でも、

変数 varを使用することしか出来ませんでした。

定数 letの方が適しているにもかかわらず.....

しかし、

Swift1.2では条件によって定数 letを初期化させることが出来るようになりました。

例)

//以前の書き方

var y:Int = 2
var x:Int = 0
if y == 3 {
x = 4
} else {
x = 6
}

// Swift 1.2

var y:Int=2
let x:Int
if y == 3 {
x = 4
} else {
x = 6
}


3.2 if let構文

・1つのif let文で複数の宣言ができるようになりました。

・これまでのようにif let文を入れ子にする書き方もできます。

これでネストの蟻地獄を回避できます!

例) 入れ子にする書き方と複数宣言するやり方です。

if let文 を複数宣言すると以下のようにシンプルに書くことができます。

//swift1.1までのコード (if let文を入れ子にする書き方)

let condition = true
let id: Int? = 1
let value: Int? = 100
let cost: Int? = 300
if condition {
if let a = id {
if let b = value {
if let c = cost {
if b < c {
println(a)
println(b + c)
}
}
}
}
}

//swift1.2で書けるようになったコード (if let文を複数宣言する書き方)

let condition1 = true
let id:Int? = 1
let value: Int? = 100
let cost: Int? = 300
if condition1,
let a = id,
let b = value,
let c = cost
where value < cost {
println(a)
println(b + c)
}

メモ:

オプショナルの説明


3.3 インスタンスの定数への代入は1度だけ

インスタンスの定数 letへの代入は初期化を含めて1度しかできません。


1.2からは、let定数をイニシャライズで初期化する場合は、定義する際に初期値を設定することが出来なくなりました。


メモ:

クラスやインスタンスなどの説明


4. 新たなネイティブのSetデータ構造


CollectionTypeArrayDictionaryなどに加えてSetが追加されました。

Setは、値の重複を許さない順序なしコレクションです。

Objective-CNSSetの橋渡しをし、

配列やディクショナリと同じように値に意味を与えます。

そして、touchesBegantouchesMovedなどのタッチイベント系の引き数の型が、

Setデータ型に変わりました。

Objective-CNSSetの橋渡しをし、

配列やディクショナリと同じように値に意味を与えます。


例) NSSetSet< NSObject > に変更する

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {


5. staticが使えるようになった


Swift 1.2からclassにもstaticな関数やプロパティを持てるようになりました。

これまでもclass funcがありましたが、

static funcclassかつfinalという意味になります。

またstatic letで宣言した定数は、

最初にアクセスされた時点で評価されるという特徴を持ちます。


class StaticPropertiesAndMethods {

static func printDate() {
println(date)
}
static let date = NSDate()
}

StaticPropertiesAndMethods.printDate() // => "2015-04-10 07:01:00 +0000"

Swift でシングルトン (Swift 1.2版)


6. countElements()の廃止


Swift1.2では、文字数を数えるのにcountElements()ではなくcount()を使います。

ちなみに、1.1でもcount()という関数があり、countElements()と同じであると定義されています。


メモ:

Swift1.2の関数一覧


Xcode 6.3 について

Xcode6.3から、

古いSwiftのソースコードをSwift1.2仕様にコンバートしてくれる機能がついています。

コンバートとは、修正のプロセスを自動化してくれる移行ツールです。


1.0と1.1でさほど変更点はありませんでしたが、

1.2では記述が変わったものが幾らかあり、

そのままではコンパイルすることが出来ない可能性が高いです。

そのようなことからXcode6.3では、

古いSwiftのソースコードをSwift1.2仕様にコンバートしてくれる機能がついています。

【やり方】

メニューの [Edit] > [Convert] > [To Latest Swift Syntax...]

表示される画面で[Next]を押すと、ターゲットの一覧が表示されるので、

アプリのターゲットのみチェックをし、コンバートを行います。

コンバートする箇所の検索が終わると一覧で表示されるので、

内容を確認し[Save]でコンバート完了です。



おわりに

以上、【Xcode 6.3 / Swift 1.2】仕様変更について

まとめてみました。

今年の秋頃に、

Swiftがオープンソース化され、

Swift2もリリースされるので楽しみです!


参考サイト

・Xcode 6.3/Swift 1.2に関する補足情報,マイナビ

URL: https://book.mynavi.jp/support/pc/5353/Xcode63_support/index.html

・[Swift] Xcode6.3に上げたらビルドが通らなかった話

URL: http://www.dorapro.co.jp/engineerblog/?p=688

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

URL: http://qiita.com/ori_ika/items/d723103b7baa3e22d4a4

・Swift 1.2 で個人的に気になったところまとめ

URL: http://qiita.com/karly/items/3e9c4387f60bfea8424d

・Swift 1.2 and Xcode 6.3 beta

URL: https://developer.apple.com/swift/blog/?id=22

・Xcode6.3アップデートすると必ずやってくるSwift1.2のエラー対処のいくつか

URL: http://qiita.com/osamu1203/items/09ab7ba89b2101a855f7

・Swift 1.2 cockscomb on hatena blog

URL: http://cockscomb.hatenablog.com/entry/2015/04/30/095612