web-dev-qa-db-ja.com

Swift-プロパティのカスタムセッター

プロジェクトをSwiftコードに変換していますが、セッターで問題に遭遇しました。Objective-Cコードは次のようになりました。

- (void)setDocument:(MyDocument *)document
{
    if (![_document isEqual:document]) {
        _document = document;

        [self useDocument];
    }
}

そして、ドキュメントが設定されるたびにView Controllerがこれを実行できるようにしました(通常はprepareForSegue:提示するView Controllerのメソッド)。

プロパティオブザーバーwillSetおよびdidSetが見つかりましたが、プロパティが更新されているときのみ機能し、初期化および更新されたときは機能しません。

何か案は?ありがとう

更新

get {}とset {}を試した後、EXC_BAD_ACCESSエラー

var document: UIDocument? {
    get {
        return self.document!
    }
    set {
        self.document = newValue

        useDocument()
    }
}
21
Adam Carter

setをそのように使用することはできません。なぜなら、self.document = newValueもう一度セッターを呼び出しているだけです。無限ループを作成しました。

代わりに行う必要があるのは、値を実際に格納するための個別のプロパティを作成することです。

private var _document: UIDocument? = nil
var document: UIDocument? {
    get {
        return self._document
    }
    set {
        self._document = newValue
        useDocument()
    }
}
47
Mike S

Swift 3バージョン

var document : UIDocument? {
    didSet {
        useDocument()
    }
}
8
John Stephen