私はSwiftクラスTest
を次の初期化子で使用しています。Swiftの変数割り当てに失敗しました
import Foundation
class Test {
var x: Int
var response: [String: AnyObject]
init(_ x: Int) {
self.x = x
self.response = [String: AnyObject]()
self.y(x)
}
}
Test
の中には、以下の方法もあります。呼び出しy
func y(_ x: Int) {
// This is a task with a completion handler of type (_, _, _) -> Void
let ... = ...(with: ..., completionHandler: {() in
do {
// The type of z is [String: AnyObject]
let z = ...
self.response = z
} catch {
return
}
})
はself.response
にz
を再割り当てすることになったが、self.response
は永続的に空の辞書です。
何か不足していますか?
ときあなたのcompletionHandlerはasyncと呼ばれ、 'self'はまだ存在しますか? また、completionHandlerは自動で 'エスケープする 'ので、self.responseをどこでチェックしましたか? – antonio081014
関数yは補完ハンドラが終了するのを待っていません。すぐに戻り、Test.init()はself.responseが設定される前に完了します。また、自己への弱い参照を補完ハンドラに渡す必要があります。 – onnoweb
@onnoweb 'completionHandler:{()in'を' completionHandler:{[weak self]()in'と 'self.response = z'を' self?.response = z'に変更すると、 'self.response'まだ空です。 – Angelo