2016-11-14 80 views
2

我更新斯威夫特3後無法正常使用下面的代碼行的困難:奇怪避開功能的行爲3

private var functionHandlers = [(() -> Int) ->()]() 

private var myFunction: (() -> Int)? 

func doRegister() { 
    functionHandlers.append { (f: (() -> Int)) in 
     myFunction = f 
    } 
} 

這給我的編譯器錯誤:Assigning non-escaping parameter 'f' to an escaping closure

所以後來,我想這:

func doRegister() { 
    functionHandlers.append { (f: @escaping (() -> Int)) in 
     myFunction = f 
    } 
} 

這:

func doRegister() { 
    functionHandlers.append { (f: (@escaping() -> Int)) in 
     myFunction = f 
    } 
} 

其中,在這兩種情況下,固定我的第一個錯誤,但後來給了我一個新的編譯器錯誤:Cannot convert value of type '(@escaping (() -> Int)) ->()' to expected argument type '(() -> Int) ->()'

於是我試圖改變的functionHandlers類型如下:

private var functionHandlers = [(@escaping (() -> Int)) ->()]() 

但只是導致語法錯誤。

任何人都可以向我解釋爲什麼發生這種情況,我能做些什麼來解決這個問題?

+0

'.append {}'尾隨閉包來自哪裏? – Alexander

+0

他正在追加一個函數@AlexanderMomchliov – Hamish

+0

@Hamish哦,我看到 – Alexander

回答

3

看起來像一個bug給我。出於某種原因,編譯器不喜歡的語法:

private var functionHandlers = [(@escaping() -> Int) ->()]() 

,但它確實像:

private var functionHandlers : [(@escaping() -> Int) ->()] = [] 

這是相同的症狀,但我不確定這是相同的原因爲the compiler rejecting the [TypeA.TypeB]() syntax with nested types。雖然這樣的問題,解決它的另一種方式是通過使用typealias

typealias F = (@escaping() -> Int) ->() 

private var functionHandlers = [F]() 

然後,您可以實現doRegister()爲你正確地試圖實現它爲:

func doRegister() { 
    functionHandlers.append { (f: @escaping() -> Int) in 
     myFunction = f 
    } 
} 

雖然你當然應該file a bug report以上[(@escaping() -> Int) ->()]()未編譯。

+0

打敗我吧:) – Alexander

+0

我見過相同的問題(並與解決它與typealias)。 – matt

+1

謝謝,Hamish。我在這裏提交了一個錯誤報告:https://bugs.swift.org/browse/SR-3208 –