我想创建一个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编译器错误?
答案 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)
})
stringArray
是Array
个String
个对象,transformToDictionary
方法需要String
(element
)并返回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)
})