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

时间:2015-08-24 13:59:54

标签: ios swift

我想创建一个Array扩展,将数组转换为具有通用键/值类型的Dictionary。

这是我的代码:

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!)
})

这将导致编译器错误:

  

无法调用“变换字典”&#39;使用类型的参数列表   (([String] - &gt;(Int,String))

我在这里做错了什么或者这是一个Swift编译器错误?

2 个答案:

答案 0 :(得分:1)

在第二种情况下,您尝试对stringArray对象执行嵌套数组操作。将stringArray更改为nestedStringArray,它应该可以工作(至少它在我的Playground中完成):

function runOnComplete() {
                $('.post').val('');
                data = dataHolder;
                var html = '<div class="main-message">' + 'Post: ' + data + '</div><div class="reply"><form action="" class="form-reply"><textarea placeholder="Comment" class="reply-bx" name="reply"></textarea><input type="submit" class="reply-btn" value="comment"></div>';
                $(".result").prepend(html);
}

答案 1 :(得分:0)

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

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

stringArrayArrayString个对象,transformToDictionary方法需要Stringelement)并返回Int元组{1}}和String。这正如你所指出的那样有效。

现在采取第二个例子:

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

nestedStringArray未使用,transformToDictionary方法实际上是在stringArray上调用的。

如果我们解决了这个问题:

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

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

  
    

无法使用类型'(([String]) - &gt;(Int,String))'

的参数列表调用'transformToDictionary'   

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

此用法适用于字符串数组:

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