如何声明仅适用于特定类型的扩展?
我试过这个:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
它编译得很好.但是当我尝试使用它时
var d = Dictionary<String, String>()
var q = d.queryString() // <-- ERROR
Run Code Online (Sandbox Code Playgroud)
我收到错误:
不能在没有参数的情况下调用'queryString'
这有什么不对?我希望能够调用queryString一个词典,但只有在它的时候Dictionary<String, String>
任何帮助都非常感谢.
正如@jtbandes所说,String不符合CustomStringConvertible.CustomStringConvertible Protocol Reference建议使用String()构造函数来获取字符串,而不是使用协议作为约束.
注意:String(实例)将适用于任何类型的实例,如果实例恰好是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)
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的最终版本.
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!
}
}
Run Code Online (Sandbox Code Playgroud)
String不是CustomStringConvertible.您可以使用:
extension String: CustomStringConvertible {
public var description: String { return self }
}
Run Code Online (Sandbox Code Playgroud)
或者,我建议为这种情况制定自己的协议:
protocol QueryStringConvertible {
var queryStringRepresentation: String { get }
}
extension String: QueryStringConvertible {
var queryStringRepresentation: String { return self /*probably should escape the string here*/ }
}
extension Dictionary where
Key : QueryStringConvertible,
Value : QueryStringConvertible ...
Run Code Online (Sandbox Code Playgroud)
但实际上,我想你可能想看看NSURLQueryItem和NSURLComponents :)