2016-11-20 7 views
1

エスケープクロージャから値を格納する際に問題があります。エスケープクロージャの値を格納する

基本的に私は、エスケープするcompletionHandlerを持つget要求関数を持っています。

struct NetworkRequest { 

    func getRequest(completionHandler: @escaping (_ result: [String)]?) -> Void) { 
    // implementations 
    } 
} 

今、私は、このメソッドを呼び出す構造体を持っている:署名はこのようになります。このような何か:

struct foo { 

    var value: [String]? 
    lazy var networkRequest = NetworkRequest() 

    func testGet() { 
     networkRequest.getRequest((result) { 
     self.value = result // here's my issue 
     } 
    } 
} 

私は、この「閉鎖が暗黙的変異自己パラメータをキャプチャすることはできません」というエラーに

を取得しています私は、結果の値を格納する必要がありますが、私はできませんでした。この問題を解決するにはどうすればよいですか?

答えて

2

構造体を使用して達成しようとしている動作は、Swift 3では不可能です。 fooを構造体ではなくクラスにすることをお勧めします。
structを使用することが重要でない場合は、これが機能します。 getRequest内部自体を変更しようとfoo@escaping閉鎖completionHandlerと構造体を持っているあなたの例では

struct NetworkRequest { 

    func getRequest(completionHandler: @escaping ([String]?) -> Void) { 
     // implementations 
    } 
} 

class foo { 

    var value: [String]? 
    lazy var networkRequest = NetworkRequest() 

    func testGet() { 
     networkRequest.getRequest { result in 
      self.value = result 
     } 
    } 
} 

あなたのコードが遵守できない理由は、構造体のcopy by value性質である:

は、ここでは、コードを更新していますこのクロージャの実装。しかし、completionHandlerと呼ばれる瞬間にselfが存在することを確認するには、selfをコピーする必要があります。構造体でcopyは新しいインスタンスを作成することを意味します。つまり、self.value = resultにあるselfは、foo構造体の新しいインスタンスです。この新しいインスタンスを変更することは、この構造体のコンシューマとしてこの新しいインスタンスを取得することはないため、意味をなさないことになります。
リファレンスでコピーするので、クラスで動作します。これは、self.value = resultselfの意味が以前と同じです。

関連する問題