2017-06-24 4 views
0

私は "閉鎖が暗黙のうちに自己パラメータを捕捉することはできません"というエラーがあります。どのように修正してください教えてください?クロージャは暗黙的に自己パラメータを取得できません。 Swift

struct RepoJson { 
... 
    static func get(url: String, completion: @escaping (RepoJson!) ->()) { 
     ... 
    } 
} 

struct UsersJson { 
    var repo: RepoJson! 
    init() throws { 
     RepoJson.get(url: rep["url"] as! String) { (results:RepoJson?) in 
      self.repo = results //error here 
     } 
    } 
} 
+2

[クロージャが暗黙的に変更する自己パラメータをキャプチャできない](https://stackoverflow.com/questions/41940994/closure-cannot-implicitly-capture-a-mutating-self-paramter) – Moriya

答えて

4

structを使用しているからです。構造体は値であるため、使用するためにクロージャ内にコピーされます(COW-CopyOnWriteを使用)。コピーされたプロパティは "let"によってコピーされるので、変更することはできません。コールバックでローカル変数を変更する場合は、classを使用する必要があります。保持サイクルを避けるためには、自分を弱く捕捉することに注意してください([weak self] in)。

+0

私はクラスを使用していますそれはうまくいくのですが、私は新しい問題を抱えています。 RepoJson.get(URL:!文字列として担当者[ "URL"]){(結果:?RepoJson) で許可すればrepoDataは=結果{ self.repo = repoData }} self.repoは、値を取得しましたここでうまくいく。しかし、私が配列のrepoを出力すると、nilに等しくなります。 –

+0

クラスを初期化した直後に印刷しますか?コールバックが値を返すと、repoが充足されるためです。 – farzadshbfn

+0

ボタンを作成し、それを押して、常にnilに等しいです。 –

関連する問題