Swift 2:闭包数组字典

Swift 2:闭包数组字典,swift,Swift,我需要将字符串字典定义为键,将闭包数组定义为值。样本结构: { "url1 hash": [loadHandler1, loadHandler2], "url2 hash": [loadHandler1], "url3 hash": [loadHandler1, loadHandler2, loadHandler3], ... } 加载处理程序是简单的闭包:()->NSData? 这段代码编译时没有错误 let test1: [String: [Stri

我需要将字符串字典定义为键,将闭包数组定义为值。样本结构:

{
    "url1 hash": [loadHandler1, loadHandler2],
    "url2 hash": [loadHandler1],
    "url3 hash": [loadHandler1, loadHandler2, loadHandler3],    
    ...
}
加载处理程序是简单的闭包:
()->NSData?

这段代码编译时没有错误

let test1: [String: [String]] = [String: [String]]()

typealias Handler = () -> NSData? //workaround
let test2: [String: [Handler]] = [String: [Handler]]()

let test3: [() -> NSData?] = []
但是

在“()”和“容器文本中的预期表达式”之后提供“预期”、“分隔符”

给出“类型表达式在没有更多上下文的情况下不明确”


为什么我在最后两个例子中会出错

test4
中,您会得到该错误,因为
()
本身就是一个完整的类型:空元组aka
Void
,要声明类型是
()->NSData?
您可以使用括号作为

let test4: [String: [(() -> NSData?)]] = [String: [(() -> NSData?)]]()
或者更好地使用
typealias

test5
中出现的错误是与在
test4
中出现的错误相同的直接影响:由于编译器无法正确理解变量的类型,因此无法推断要创建并分配给
test5
的数组(
[]
)的类型

更新:在对游乐场进行了一些测试之后,我发现编译器在创建数组/字典时理解闭包类型时存在一些问题,但使用与该类型相同的声明也可以。编译器可以使用

let test3: [() -> NSData?] = []
let test4: [String: [() -> NSData?]] = [:]
但是,如果我们不声明类型并让它从我们分配给变量的数组/字典中推断出来,它就会被卡住,无法编译:

let test3 = [() -> NSData?]()
let test4 = [String: [() -> NSData?]]()

甚至将闭包的签名包装在括号中也行不通。我认为这是一个错误,你应该提交一份报告。

()
本身就是一个完整的类型”-但是为什么我在
test3
中没有遇到同样的错误呢?我刚刚在一个操场上做了一些测试,但没有找到有效的原因,编译器似乎在创建数组/字典时遇到问题,但在声明类型时可以正确理解。让我更新更详细的答案。谢谢,我会报告这个问题
let test3: [() -> NSData?] = []
let test4: [String: [() -> NSData?]] = [:]
let test3 = [() -> NSData?]()
let test4 = [String: [() -> NSData?]]()