SwiftでdidSetを使う機会が多いんだけど、この前気がついたことがある。

それはイニシャライザ内でdidSetが呼ばれないということ。何故か値が更新されずに困った。

stackoverflowにワークアラウンドが記載されていて、回避方法としてはsetVariableみたいなセッターを用意すること。

class Person {
    var name: String {
        didSet {
            nameVariable.value = name
        }
    }
    var nameVariable = Variable<String>("")

    init(name: String) {
        self.name = name
        setVariable(name)
    }

    func setVariable(_ newValue: String) {
        nameVariable.value = newValue
    }
}

上記の方法は回りくどいだけなので、このような場合は以下のように初期化時に値をセットするだけで良いと思う。

class Person {
    var name: String {
        didSet {
            nameVariable.value = name
        }
    }

    var nameVariable = Variable<String>("")

    init(name: String) {
        self.name = name
        nameVariable.value = name
    }
}

ここまで書いて気づいたんだけど、イニシャライズする際にdidSetが呼ばれないのは、didSetが呼ばれることによってどこで値がセットされているかわかりづらくなってしまうからなのかもしれない。

とは言え呼ばれて欲しい気持ちはある。