2015-07-20 15 views
-4

在Swift中,如何創建一個既有捕獲列表又有參數的閉包?你可以有一個包含捕獲列表和參數列表的閉包嗎?

我已經使用了以任一種形式呈現的代碼,但不知道如何創建具有參數和捕獲列表的閉包。

例如

關閉與參數表:

myFunction { 
    (x: Int, y: Int) -> Int in 
    return x + y 
} 

關閉與捕獲列表:

myFunction { [weak parent = self.parent] in print(parent!.title) } 

實例嘗試與捕獲列表:

class MyTest { 
    var value:Int = 3 

    func myFunction(f: (x:Int, y:Int) -> Int) { 
     print(f(x: self.value, y: 5)) 
    } 

    func testFunction() { 
     myFunction { 
      [weak self] (x, y) in //<--- This won't work, how to specify weak self here? 
      print(self.value) 
      return self.value + y 
     } 
    } 
} 
+0

我不知道我瞭解這裏的問題。你有沒有嘗試做一個兼具兩者的封閉? –

+0

是的,想知道這是否可能。我嘗試了幾種不同的方式,無法識別語法。 – Boon

+0

@ 0x7fffffff如果你能看看如何解決downvotes的濫用問題,那將是非常好的。我正在問一個合適的問題,並且已經有兩個投票。 – Boon

回答

3

的例子中,你已經給確實工作。要指定一個參數列表和捕獲列表,你只是做:

exampleFunctionThatTakesClosure() { [weak self] thing1, thing2 in 
} 

但是,創建通過參數列表中的弱引用意味着你的閉包內self就變成了可選 - 正因爲如此,你必須解開(或強制展開),然後才能使用其值。

例如,強制展開:

func testFunction() { 
    myFunction { 
     [weak self] (x, y) in 

     print(self!.value) 
     return self!.value + y 
    } 
} 

或者:

func testFunction() { 
    myFunction { 
     [weak self] (x, y) in 

     if let weakSelf = self { 
      print(weakSelf.value) 
      return weakSelf.value + y 
     } else { 
      return y 
     } 
    } 
} 
+0

感謝您解釋薄弱的參考部分。 – Boon

相關問題