2016-11-14 78 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 –