我需要将字符串字典定义为键,将闭包数组定义为值。样本结构:
{
"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?] = []但
let test4: [String: [() -> NSData?]] = [String: [() -> NSData?]]()在'()‘和“容器文本中的预期表达式”之后给出“预期的”、“分隔符”。
let test5: [String: [() -> NSData?]] = [String: []]()提供“类型表达式在没有更多上下文的情况下是歧义的”
为什么我在最后两个例子中出现了错误?
发布于 2016-01-31 17:46:24
在test4中,您会得到该错误,因为()是一个完整的类型:空元组(即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?]]()即使用圆括号包装闭包的签名也不起作用。我觉得是个漏洞,你应该提交报告。
https://stackoverflow.com/questions/35116877
复制相似问题