【发布时间】:2015-10-13 05:19:14
【问题描述】:
如何声明仅适用于特定类型的扩展?
我试过这个:
extension Dictionary where
Key : CustomStringConvertible,
Value: CustomStringConvertible
{
func queryString() -> String {
var paramArray = Array<String>()
for (key, value) in self {
paramArray.append("\(key.description)=\(value.description)")
}
return "&".join(paramArray)
}
}
它编译得很好。但是当我尝试使用它时
var d = Dictionary<String, String>()
var q = d.queryString() // <-- ERROR
我得到错误:
不能在没有参数的情况下调用“queryString”
这里有什么问题?我希望能够在字典上调用queryString,但仅限于Dictionary<String, String>
非常感谢任何帮助。
编辑
正如@jtbandes 所说,String 不符合CustomStringConvertible。 CustomStringConvertible Protocol Reference 建议使用String() 构造函数来获取字符串,而不是使用协议作为约束。
注意:String(instance) 将适用于任何类型的实例,如果该实例恰好是 CustomStringConvertible,则返回其描述。因此,不鼓励使用 CustomStringConvertible 作为通用约束,或直接访问符合类型的描述。
extension Dictionary {
public func queryString() -> String {
var paramArray = Array<String>()
for (key, value) in self {
paramArray.append("\(String(key))=\(String(value))")
}
return "&".join(paramArray)
}
}
编辑2
这是我的最终版本。
extension Dictionary {
public func queryString() -> String {
var queryItems = Array<NSURLQueryItem>()
for (key, value) in self {
queryItems.append(NSURLQueryItem(name: String(key), value: String(value)))
}
let comps = NSURLComponents();
comps.queryItems = queryItems
return comps.percentEncodedQuery!
}
}
【问题讨论】: