Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 569 - 構造体、格納型プロパティを式で設定...2

詳解 Swift 改訂版」を超スローペースで進んでいます。

格納型プロパティの初期値を式で設定する

var familyNumber = 2127

struct Family {
    struct  Member {
        var male, female: Int
    }
    static var stdMale = 3
    static var stdFemale = 3
    static var stdMember = Member(male: stdMale, female: stdFemale)
    var member: Member
    let serial = "FM:\(familyNumber++)"
    init(_ m: Int, _ f: Int) {
        member = Member(male: m, female: f)
    }
}

この構造体は、構造体をネストしていて、入れ籠の構造体がインスタンスになります。しかし、タイププロパティも持っていて、同じネストされた構造体のタイププロパティも持っています。このタイププロパティの初期化ステップで注意すべきことがあります。

ちょっとplaygorundの画面で見ます。

f:id:yataiblue:20160126101439j:plain

タイププロパティは初期値,
Family.stdMaleは「3」です。これを故意に「12」に変更してからFamily.stdMemberを呼ぶと、この時点でインスタンス化されるため、変更された「12」が設定されるので、stdMemberは(male 12, female 3)になります。

しかし、Family.stdMaleを「18」に変更しても、もう既に設定されたstdMember(male 12, female 3)の値は変化しないんです。初期値の参照が呼ばれるのはタイププロパティが最初に呼ばれる時だけです。上記playgroundの行番号「24」に「Family.stdMember」と入力してタイププロパティを呼ぶと、後のすべての値が即座に変更されるでしょう。

f:id:yataiblue:20160126104045j:plain

なるほどです。

今日はこれだけ。