swift - 词典的专门扩展

标签 swift generics

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

我尝试过这个:

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不符合CustomStringConvertibleCustomStringConvertible 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 ...

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

关于swift - 词典的专门扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31578264/

相关文章:

java - 被 Java 泛型类困住了

function - Vala 中的通用函数

java - 如何解决 IntelliJ 突出显示的未经检查的转换问题?

swift - 我如何将文本从文本字段附加到 TextView 并每次快速换行?

ios - 在 swiftui 中使用类

ios - 检测自定义 Controller 中的 UITableViewCell 单击

使用接口(interface)的 Java 泛型方法

Swift/JS 还原 WebView 后退转发列表

swift - 在 Swift 中获取字符串的第 n 个字符

java - 不兼容的类型、泛型、<E>