しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Swift再入門13 − The Swift Programming Languageを読んでみる

この記事では「The Swift Programming Language」を1から読んだ感想とか発見を書いてみようと思います。
「The Swift Programming Language」とはSwiftの公式ドキュメントでiBooksや下ページで見る事ができます。

The Swift Programming Language (Swift 2.1): About Swift

読んだ所

今回はSubscriptsという項目を読みました。

The Swift Programming Language (Swift 2.1): Subscripts

学んだこと

Subscriptの定義

下のようにvalue[0]というプロパティーアクセスをしたい場合はsubscriptを使います。

class MyClass {
    subscript(value: Int) -> String {
        get {
            return "AAA"
        }
    }
}

MyClass()[0]

構造体でも同じです。

struct MyStruct {
    subscript(value: Int) -> String {
        get {
            return "AAA"
        }
    }
}

MyStruct()[0]

値をセットしたい場合はsetを定義します。
getがない場合はエラーになります。

class MyStruct {
    subscript(value: Int) -> String {
        get {
            return "AAA"
        }
        set {
        }
    }
}

var struct = MyStruct()
struct[0] = "AAA"

Voidを戻り値にする事もできるようです。
空タプルをセットする事ができます。

struct MyStruct {
    subscript(value: Int) -> Void {
        get {
        }
        set {
        }
    }
}

a[0] = ()

複数の値を扱うSubscript

下のように複数の値を扱うSubscriptも定義できます。

struct MyStruct {
    subscript(value: Int, value2: Int) -> Void {
        get {
        }
        set {
        }
    }
}

var struct = MyStruct()
print(struct[1, 0])
struct[1, 0] = ()
struct MyStruct {
    subscript(value: Int, value2: Int) -> Void {
        get {
        }
        set {
        }
    }
}

var struct = MyStruct()
print(struct[1, 0])
struct[1, 0] = ()

可変長引数にも対応しています。

struct MyStruct {
    subscript(value: Int, value2: Int...) -> Void {
        get {
        }
    }
}
var struct = MyStruct()
print(struct[1, 0, 1, 2])

ラベルを付ける事もできます。

struct MyStruct {
    subscript(value value: Int, value2: Int) -> Void {
        get {
        }
    }
}

let struct = MyStruct()
print(struct[a: 1, 2])

デフォルト引数はDefault argument is only permitted for a non-curried funcion parameterってエラーで使えませんでした。

struct MyStruct { // これはエラー
    subscript(value value: Int = 1, value2: Int) -> Void {
        get {
        }
    }
}