Swift错误:无法使用类型为(([String]) - >(Int,String))的参数列表调用(..)

3
我希望创建一个数组扩展,将数组转换为具有通用键/值类型的字典。
这是我的代码:
extension Array  {
    func transformToDictionary<K: Hashable, V>(@noescape mappingFunction: (Array.Generator.Element) -> (K, V)) -> [K: V] {
        var dict: [K: V] = [:]
        for el in self {
            let result = mappingFunction(el)
            dict[result.0] = result.1
        }
        return dict
    }
}

这适用于一些情况,例如:
let stringArray = ["String1", "String2"]
stringArray.transformToDictionary({ (element: String) -> (Int, String) in
    return (element.hashValue, element)
})

但在另一种情况下却不起作用,例如:

let nestedStringArray = [["String1"], ["String2"]]
stringArray.transformToDictionary({ (element: [String]) -> (Int, String) in
     return (element.first!.hashValue, element.first!)
})

这将导致编译器错误,显示如下信息:

无法使用类型为(([String) -> (Int, String))的参数列表调用'transformToDictionary'

我在这里做错了什么,还是这是Swift编译器的错误?
2个回答

1
在第二种情况下,您正在尝试对stringArray对象执行嵌套数组操作。在此处将stringArray更改为nestedStringArray,它应该可以工作(至少在我的Playground中是这样的):
let nestedStringArray = [["String1"], ["String2"]]
nestedStringArray.transformToDictionary({ (element: [String]) -> (Int, String) in
     return (element.first!.hashValue, element.first!)
})

抱歉打错字了。但是在嵌套数组上执行该函数仍然导致相同的错误。 - Argent
你使用的是哪个版本的Xcode?在Xcode 6.4下,这对我来说运行良好。 - Tom Elliott

0

首先让我们检查第一个例子:

let stringArray = ["String1", "String2"]
stringArray.transformToDictionary({ (element: String) -> (Int, String) in
    return (element.hashValue, element)
})

stringArray 是一个由 String 对象组成的 Array,而 transformToDictionary 方法则期望一个 String 类型的参数(element),并返回一个由 IntString 组成的元组。正如您所指出的那样,这个方法是有效的。

现在我们来看第二个例子:

let nestedStringArray = [["String1"], ["String2"]]
stringArray.transformToDictionary({ (element: [String]) -> (Int, String) in
    return (element.first!.hashValue, element.first!)
})

nestedStringArray 这个数组并未被使用,实际上是在 stringArray 上调用了 transformToDictionary 方法。

如果我们修复这个问题:

let nestedStringArray = [["String1"], ["String2"]]
nestedStringArray.transformToDictionary({ (element: [String]) -> (Int, String) in
    return (element.first!.hashValue, element.first!)
})

我们仍然会遇到你提到的错误:

无法使用类型为“(([String]) -> (Int, String))”的参数列表调用'transformToDictionary'

原因是返回元组中的第二项是一个 String,但输入值是一个字符串数组 ([String])。

这种用法将适用于字符串数组:

let nestedStringArray = [["String1"], ["String2"]]
nestedStringArray.transformToDictionary({ (element: [String]) -> (Int, [String]) in
    return (0, element)
})

嵌套示例指定了数组的第一个元素,因此您不会像您描述的那样出现错误,并且不需要将返回类型更改为Array。 - Tom Elliott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接