【问题标题】:Dictionary extension in Swift is not recognizedSwift 中的字典扩展无法识别
【发布时间】:2018-08-02 21:08:09
【问题描述】:

我正在尝试使用以下代码扩展字典:

extension Dictionary where Key: ExpressibleByStringLiteral, Value: AnyObject {

    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
    }

}

我在哪里写类似的东西:

let x: [String: String] = ["": ""]    
x.jsonString

我收到此错误:

Value of type '[String: String]' as no member 'jsonString'

我缺少什么吗?

【问题讨论】:

  • String 是值类型,不符合AnyObject。尝试改用Any
  • 其中键:ExpressibleByStringLiteral,值:任意{
  • 抱歉,没有任何效果...

标签: swift dictionary swift4 swift-extensions


【解决方案1】:

根本不需要限制字典值类型:

extension Dictionary where Key: ExpressibleByStringLiteral {
    var jsonString: String? {
        guard let data = try? JSONSerialization.data(withJSONObject: self)
        else { return nil }
        return String(data: data, encoding: .utf8)
    }
}

【讨论】:

  • 对不起,它不起作用。也许它与 Swift 4 有关?
  • 不起作用它太模糊了。我在这里用字典 [String:String] 对其进行了测试,它按预期工作
  • 同样的错误...不知道为什么我一直得到它...也许扩展的文件不知何故无法识别...?
  • 确保您的文件列在应用目标构建阶段的编译源中
  • 该文件在编译源中列出,但它一直无法正常工作,因此我将扩展名复制到另一个具有另一个工作扩展名的文件中并且它可以工作。奇怪的事情...谢谢!
【解决方案2】:

既然String是一个值类型,那就找它的

public struct String {

AnyObject仅指类的任何实例,相当于Objective-C中的id,所以这个x的声明

[String: String] 不适合 [String: AnyObject]

因为Any 指的是类、struct 或枚举的任何实例,所以它非常适合

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多