首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字典的扩展,其中<String,AnyObject>

字典的扩展,其中<String,AnyObject>
EN

Stack Overflow用户
提问于 2015-09-16 13:35:00
回答 7查看 37K关注 0票数 51

我正在尝试创建一个字典扩展,字典的类型为。

在许多地方寻找不同的方法,但似乎都没有用。这是其中之一:

代码语言:javascript
复制
extension Dictionary where <String, AnyObject>{
    var jsonString:String {
        return ""
    }
}

另一种由于某些原因而不起作用的方法:

代码语言:javascript
复制
extension Dictionary where Key:Hashable, Value:AnyObject {

    var jsonString:String {

        do {
           let stringData = try NSJSONSerialization.dataWithJSONObject(self, options: NSJSONWritingOptions.PrettyPrinted)
            if let string = String(data: stringData, encoding: NSUTF8StringEncoding){
                return string
            }
        }catch _ {

        }
        return ""
    }
}

Got:参数类型“字典”不符合“AnyObject”的预期类型

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-09-16 13:41:14

>=3.1

从3.1开始,我们可以进行具体的扩展,即:

代码语言:javascript
复制
extension Dictionary where Key == String {}

<3.1

我们不能符合混凝土的类型,如:

代码语言:javascript
复制
extension Dictionary where Key == String

但是,因为字典符合序列,而且我们可以遵循协议类型w/具体泛型,所以我们可以这样做:

代码语言:javascript
复制
extension Sequence where Iterator.Element == (key: String, value: AnyObject) {
    func doStuff() {...

否则,我们可以将密钥约束到字符串符合的协议,如下所示:

代码语言:javascript
复制
extension Dictionary where Key: StringLiteralConvertible, Value: AnyObject {
    var jsonString: String {
        return ""
    }
}

根据你最新的答复。Json序列化需要一个对象,Swift字典是结构化的。您需要转换为NSDictionary,您必须指定Key以符合NSObject,才能正确地转换为NSDictionary

注意:字典已经将约束Key输入为Hashable,因此原始约束没有添加任何内容。

代码语言:javascript
复制
extension Dictionary where Key: NSObject, Value:AnyObject {

    var jsonString:String {

        do {
            let stringData = try NSJSONSerialization.dataWithJSONObject(self as NSDictionary, options: NSJSONWritingOptions.PrettyPrinted)
            if let string = String(data: stringData, encoding: NSUTF8StringEncoding){
                return string
            }
        }catch _ {

        }
        return ""
    }
}

注意,字典必须符合这种类型才能访问扩展。

代码语言:javascript
复制
let dict = ["k" : "v"]

将成为[String : String]类型,因此您必须明确声明:

代码语言:javascript
复制
let dict: [NSObject : AnyObject] = ["k" : "v"]
票数 113
EN

Stack Overflow用户

发布于 2015-10-23 16:37:35

Swift 3的更新

下面是我的示例:ExpressibleByStringLiteral用于KeyAny用于Value

代码语言:javascript
复制
extension Dictionary where Key: StringLiteralConvertible, Value: Any {
    var jsonString: String? {
        if let dict = (self as AnyObject) as? Dictionary<String, AnyObject> {
            do {
                let data = try JSONSerialization.data(withJSONObject: dict, options: JSONSerialization.WritingOptions(rawValue: UInt.allZeros))
                if let string = String(data: data, encoding: String.Encoding.utf8) {
                    return string
                }
            } catch {
                print(error)
            }
        }
        return nil
    }
}

然后我就这样用它:

代码语言:javascript
复制
let dict: Dictionary<String, AnyObject> = [...]
let jsonString = dict.jsonString

您可以将self转换为AnyObject或NSObject,这两种方法都是有效的,然后将其解压缩为字典或任何其他特定类型。

票数 8
EN

Stack Overflow用户

发布于 2017-01-11 09:27:20

Swift 3逼近

代码语言:javascript
复制
extension Dictionary where Key: ExpressibleByStringLiteral, Value: AnyObject

因为StringLiteralConvertible现在被废弃,代之以ExpressibleByStringLiteral

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32610150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档