专业的词典扩展

nac*_*o4d 2 generics swift

如何声明仅适用于特定类型的扩展?

我试过这个:

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)

EDIT2

这是我的最终版本.

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)

jtb*_*des 5

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)

但实际上,我想你可能想看看NSURLQueryItemNSURLComponents :)