如何声明仅适用于特定类型的扩展?
我尝试过这个:
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
我收到错误:
Cannot invoke 'queryString' with no arguments
这里出了什么问题?我希望能够调用queryString
在字典上,但仅当它是 Dictionary<String, String>
时
非常感谢任何帮助。
编辑
正如@jtbandes所说,String
不符合CustomStringConvertible
。 CustomStringConvertible Protocol Reference建议使用 String()
构造函数来获取字符串而不是使用协议(protocol)作为约束。
NOTE: String(instance) will work for an instance of any type, returning its description if the instance happens to be CustomStringConvertible. Using CustomStringConvertible as a generic constraint, or accessing a conforming type's description directly, is therefore discouraged.
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!
}
}
最佳答案
String
不是 CustomStringConvertible
。您可以使用:
extension String: CustomStringConvertible {
public var description: String { return self }
}
或者,我建议您为这种情况制定自己的协议(protocol):
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 ...
但实际上,我想你可能想看看 NSURLQueryItem和 NSURLComponents :)
关于swift - 词典的专门扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31578264/