someFunction(completion: { [weak self] in
self?.variable = self!.otherVariable
})
これは常に安全ですか?私self
はステートメントの冒頭でオプションにアクセスします。個人的には、このステートメントの2番目の部分は、の場合self
は実行されないと想定していnil
ます。これは本当ですか?場合はself
確かにあるnil
、第二の部分は決して起こらないだろうか?そして、self
この1行のコードの間に「埋め尽くされる」可能性は決してありませんか?
「Swiftプログラミング言語」からのオプションのチェーンは、次の例を示します。
let john = Person() // ... let someAddress = Address() // ... john.residence?.address = someAddress
続いて(強調を追加):
この例では、john.residenceが現在nilであるため、john.residenceのアドレスプロパティを設定しようとしても失敗します。
割り当てはオプションの連鎖の一部です。つまり、=演算子の右側のコードは評価されません。
あなたのケースに適用:
self?.variable = self!.otherVariable
右側はされていない場合は、評価self
ですnil
。したがって、あなたの質問への答え
自己が本当にnilの場合、2番目の部分は決して発生しませんか?
「はい」です。2番目の質問に関して
そして、この1行のコードの実行中に、自己が「埋もれる」可能性は決してありませんか?
私の元々の仮定は、いったんであるself
と決定されると、ステートメントの評価全体を通して!= nil
強い参照self!
が保持されるため、これが起こらないようにすることでした。ただし(@Hamishが指摘したように)、これは保証されません。AppleエンジニアのJoe Groffは、Swiftフォーラムの「操作の順序の確認」で次のように書いています。
これは保証されていません。リリースは、これよりも前に、最後に強参照が正式に使用された後の任意の時点で最適化される場合があります。左辺を評価するためにロードされた強参照
weakProperty?.variable
は後で使用されないので、それを維持するものは何もないので、すぐに解放できます。
変数のゲッターに副作用があり、それによってによって参照さweakProperty
れるオブジェクトの割り当てが解除され、弱い参照が無視されると、右側の強制アンラップが失敗します。ifを使用して弱参照をテストし、if let
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加