【swift】2.2の変更点(2)

概要

リリースノートをベースに【swift】2.2の変更点を作成しましたが、わかりやすい記事があったので、こちらも紹介します。

++ and -- are deprecated

++、--記法が非奨励になりました。swift 3.0ではエラーになります。

var i = 0
// 非奨励
i++
// 今後はこのように記述します
i += 1
i = i + 1

cスタイルのループ記法が使えなくなります。

for var i = 1; i <= 10; i += 1 {
    print("\(i) green bottles")
}

for in構文を使います。

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

for in 構文は、開始値<終了値という制約があります。

for var i = 10; i >= 0; i -= 1 {
}

この場合、以下のように記述します。

for i in (1...10).reverse() {
}

Arrays and other slice types now have removeFirst()

最初の要素を取り出す関数removeFirstが追加されました。removeAtIndex(0)でも同じことができます。

var array = Array(1...10)
array.removeFirst() // 1
array.removeLast() // 10
print(array.count) // 8

ただし、removeFirst/removeLastは要素が存在しない場合には実行時エラーになります。

var array = [Int]()
array.removeFirst() // 実行時エラー

該当の要素がない場合、nilを返す最後の要素を取得する関数popLastがありますが、popFirstは追加されません。

var array = [Int]()
array.popLast() // nil

You can now compare tuples (within reason)

タプルの比較演算子が追加されました。

let singer = ("Taylor", "Swift")
let alien = ("Justin", "Bieber")

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

Tuple splat syntax is deprecated

引数をタプルで渡すことが非奨励になりました。

func describePerson(name: String, age: Int) {
    print("\(name) is \(age) years old")
}

let person = ("Taylor Swift", age: 26)
describePerson(person)

More keywords can be used as argument labels

一部のキーワードを引数ラベルとして使えるようになりました。

func printGreeting(name: String, repeat repeatCount: Int) {
    for _ in 0 ..< repeatCount {
        print(name)
    }
}

printGreeting("Taylor", repeat: 5)

var parameters have been deprecated

引数を関数内で変更できるようにするためのキーワードvarが非奨励になりました。値を変更する場合には、別変数を使います。

func printGreeting(var name: String, repeat repeatCount: Int) {
    // 値を変更できる
    name = name.uppercaseString

    for _ in 0 ..< repeatCount {
        print(name)
    }
}

printGreeting("Taylor", repeat: 5)

変数を別途作成します。

func printGreeting(name: String, repeat repeatCount: Int) {
   // 新しい変数に値をセットします。
    let upperName = name.uppercaseString

    for _ in 0 ..< repeatCount {
        print(upperName)
    }
}

printGreeting("Taylor", repeat: 5)

Renamed debug identifiers: #line, #function, #file

swift 2.1以前では、__LINE__や__FUNCTION__のシンボルが行数、関数名に置換されました。2.2移行では、#line, #functionになります。

func printGreeting(name: String, repeat repeatCount: Int) {
    // old - deprecated!
    print("This is on line \(__LINE__) of \(__FUNCTION__)")

    // new - shiny!
    print("This is on line \(#line) of \(#function)")

    let upperName = name.uppercaseString

    for _ in 0 ..< repeatCount {
        print(upperName)
    }
}

printGreeting("Taylor", repeat: 5)

Stringified selectors are deprecated

文字列セレクタが非奨励になりました。

以下の例だと、セレクタを#selector(buttonTapped)と記述します。もし、関数buttonTappedがなければコンパイルエラーになります。

navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Tap!", style: .Plain, target: self, action: "buttonTaped")

Compile-time Swift version checking

コンパイル時にバージョンチェックできるビルドオプションが追加されました。

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

New documentation keywords: recommended, recommendedover, and keyword

swiftはmarkdown形式のドキュメントを書くことができます。

/**
Say hello to a specific person
- parameters:
- name: The name of the person to greet
- returns: Absolutely nothing
- authors:
Paul Hudson
Bilbo Baggins
- bug: This is a deeply dull function
*/
func sayHello(name: String) {
    print("Hello, \(name)!")
}

sayHello("Bob")

Swift 2.2で、3つのキーワードが追加されました。recommended, recommendedover, keyword。 Xcode 7.3では、このキーワードを追加しても何も変わりません。

関連情報