2016-04-02 13 views
1

私はsthを多分奇妙にしようとしていますが、私は次の問題をスタックしています。非同期閉包変数を持つ構造関数

私は、非同期関数を設定するclosureプロパティを持つ構造体を持っています。

私が望むのは、この非同期関数を呼び出して戻り値を取得することです。

私はこれを回避策で解決できますが、正しい方法で解決したいと思います。

何か助けていただければ幸いです。奇妙な重複に

struct Item { 
    var myselector: (String -> Void)? 
    func getMeThat(completion: String -> Void) { 
    completion(myselector()) // error: cannot call value of non-function type String -> Void 
    } 
} 

class API { 
    class func requestThing(completion: String -> Void) { 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), { 
     completion("Kenan") 
    }) 
    } 
} 

class ViewController { 
    func viewDidLoad() { 
    var item = Item() 
    item.myselector = { // error: cannot assign value of type() ->() to type String -> Void 
     API.requestThing({ (str: String) in 
     <#code#> 
     }) 
    } 
    item.getMeThat({ (rtn: String) in 
     print(rtn) 
    }) 
    } 
} 
+0

あなたが直接あなたの質問の代わりに、スクリーンショットにエラーメッセージを編集してくださいすることができますどのようにでしょうか? – NobodyNada

答えて

2

主要な問題は、あなたがあなたの署名を持ってミスマッチである:

は、ここに私のコードです。

構造体の変数としてクロージャーを設定していますが、関数にも補完を提供しています。どちらか一方をしてください。

struct Item { 
    func getMeThat(completion: String -> Void) { 
     API.requestThing(completion) 
    } 
} 

class API { 
    class func requestThing(completion: String -> Void) { 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), { 
      completion("Kenan") 
     }) 
    } 
} 

class ViewController { 
    func viewDidLoad() { 
     let item = Item() 
     item.getMeThat({ (rtn: String) in 
      print(rtn) 
     }) 
    } 
} 

あなただけのコードの実行を遅延する場合、これはあなたがそれ

struct Item { 
    var myselector: (Void -> Void)? 
    func executeSelector() { 
     guard let sel = myselector else { 
      return 
     } 

     sel() 
    } 
} 

class API { 
    class func requestThing(completion: String -> Void) { 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), { 
      completion("Kenan") 
     }) 
    } 
} 

class ViewController { 
    func viewDidLoad() { 
     var item = Item() 
     item.myselector = { 
      API.requestThing({ (str: String) in 
       print(str) 
      }) 
     } 
     item.executeSelector() 
    } 
} 
+0

ありがとうございました。あなたが正しいですが、私は変数として関数を設定し、どこか別の場所に呼び出す必要があります。関数が非同期である必要がない場合は、このアーキテクチャで動作します。 –

+0

非同期呼び出しがどのように問題になるかわからないので、非同期呼び出しが返ってきたときに必要な項目をクロージャで取得する必要があります。クロージャは、dispatch_afterクロージャによってキャプチャされてしまうので、それ自体がキャプチャされたものはすべてその時点で存在します。 –

+0

Yess。あなたの2番目の答えは、私が欲しいものに合っています。努力してくれてありがとう。 –

関連する問題