Swift 2.2で何が変わったか?

今回公式リリースされたSwift 2.2は、Swiftをオープンソース化してからGitHubを通じて反映されたさまざまなバグ修正と機能の追加が含まれる初の公式バージョンです。Xcode 7.3とともにリリースされたのですが、何が変わったか整理してみました。 Swift 3が今年下半期に(10月ごろ)発表される予定ですが、今回のリリースはそれに向けて非互換の変更を減らし、コードレベルの互換性を守りながらさまざまなバグ修正と機能追加がありました。

下記の内容がSwift 2.2のすべてではなく、公式リリースで今回取り込まれたとされているSwift Proposalを中心に整理しました。より詳しくは公式のリリースでご確認ください。


++--とCスタイルのForループが非推奨

SE-0004: num++の代わりにintegerやfloatではnum += 1を使わないといけなくなり、Indexタイプではx = x.successor()を使うことになります。++を使っているとすぐにコンパイルエラーが発生するわけではありません。ただし、下記のように3.0では削除される機能なので、警告が出てコードを修正するためのサジェスチョンが出ます。Swift 3.0が出るときはもっと多くのの修正が入るのであらかじめ修正しておくといいでしょう。

記事の更新情報を受け取る

++--が無くなる理由はa++++aのように、明確に定義されているが直感的でない表現を無くすためです。そしてこの表現を最も多く使う場合はForループですが、C-スタイルのForループは削除されるため大きな不便はないでしょう。

CスタイルのForループが非推奨

これからは下記のようなループを使用しましょう。

for i in 1...10 {
    print("\(i) iphone")
}

配列を直接ループすることもできます。

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for number in array {
    print("\(number) green bottles")
}

古いCスタイルForループは3.0では完全に削除されます。

引数ラベルでより多くのキーワードが使用可能に

引数ラベルはSwiftの機能の一つです。下記のようにパラメータにラベルをつけることができます。パラメータを順番ではなくラベルで区別して理解しやすいコードが書ける機能です。

for i in 1.stride(through: 9, by: 2) {
    print(i)
}

この結果はstride関数のthroughとtoが違うので下記のコードとは異なります(strideドキュメント)。

for i in 1.stride(to: 9, by: 2) {
    print(i)
}

引数ラベルとして使える名前には制約が多かったのですが、Swift 2.2ではほとんどのキーワードを書けるようになりました。現在はvar、let、inoutを使うことができませんがこの制約もSwift 3.0ではなくなります。 さらに詳しい内容はProposal SE-0001を参考にしてください。

タプル同士の比較

以前はできなかったタプル同士の比較ができるようになりました。

let singer = ("Taylor", "Swift")
let korea = ("Gangnam", "Style")

if singer == korea {
    print("Matching tuples!")
} else {
    print("Non-matching tuples!")
}

しかし、比較できるのはタプルの要素が6つ以下の場合に限ります。。 さらに詳しい内容はProposal SE-0015を参考にしてください。

Associated Typeの定義方法が変更に

typealiasというキーワードでは2つのタイプを宣言することができました。

  • Type Aliases
  • Associated Types

これらは異なるものであるにもかかわらず、どちらにもtypealiasが使われていました。これからはAssociated Typeを宣言するためにはtypealiasの代わりにassociatedTypeを使用するように変更されました。 さらに詳しい内容はProposal SE-0011を参考にしてください。

コンパイル時のSwiftバージョンチェック

Swift 2.2は以下のようにSwiftバージョンチェックのための機能をビルドConfigurationで指定できます。

#if swift(>=2.2)
print("Running Swift 2.2 or later")
#else
print("Running Swift 2.1 or earlier")
#endif

さらに詳しい内容はProposal SE-0020を参考にしてください。

その他

  • Swift Package Managerはリリースにはまだまだ時間がかかるとされています。
  • まだLinuxでは大きな進捗はないとされています。今回のリリースにSwift Core Librariesは含まれていませんが、LLDBとREPLは含まれているそうです。
  • ドキュメントもアップデートされました。こちらで確認してください。

About the content

This content has been published here with the express permission of the author.


Realm Korea

Realm Korea Team

4 design patterns for a RESTless mobile integration »

close