LoginSignup
25
24

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-10

はじめに

以前、アプリ開発をしている最中に、
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

25
24
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
25
24