しめ鯖日記

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

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

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

The Swift Programming Language (Swift 2.1): About Swift

読んだ所

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

The Swift Programming Language (Swift 2.1): Methods

学んだこと

mutating修飾子

Structのメソッドでプロパティーの値を変更する場合はmutatingが必要です。
クラスではmutatingなしでプロパティーの値を変更できます。

struct MyStruct {
    var prop = 0
    mutating func change() {
        prop += 1
    }
}

var myStruct = MyStruct()
myStruct.change()

mutatingがついていてもletで宣言した場合はエラーになります。

let myStruct = MyStruct() // → これはエラーになる
myStruct.change()

selfの書き換え

structとenumではメソッド中でselfを書き換える事もできます。

struct MyStruct {
    var prop = 0
    mutating func change() {
        prop += 1
        self = MyStruct(prop: 10)
    }
}

var myStruct = MyStruct()
myStruct.change()
print(myStruct.prop)

selfの書き換えはenumと相性が良さそうです。

enum TriStateSwitch {
    case Off, Low, High
    mutating func next() {
        switch self {
        case Off:
            self = Low
        case Low:
            self = High
        case High:
            self = Off
        }
    }
}

クラスメソッドの書き方

クラスメソッドを定義する為の修飾子はstaticとclassの2種類があります。
違いですが、staticがサブクラスでのオーバーライド不可、classだとオーバーライドができます。

class A {
    static func aaa() {
        print(1)
    }
    
    class func bbb() {
        print(1)
    }
}

class B: A {
    override static func aaa() { // → エラーになる
        print(1)
    }
    
    override class func bbb() {
        print(1)
    }
}

staticとclassはお互いに呼べ合えるようです。

class A {
    static let a = 1
    class var b: String { return "" }
    
    static func aaa() {
        print(a)
        print(b)
    }
    
    class func bbb() {
        print(a)
        print(b)
        aaa()
    }
}