【问题标题】:Updating to swift 3 JSON file更新到 swift 3 JSON 文件
【发布时间】:2017-03-04 03:01:49
【问题描述】:

我正在将我的应用更新为 swift 3

我遇到了几个错误

for (k, v): (AnyObject, AnyObject) in value {

获取一个 NSDictionary.Iterator.Element 不可转换为 (Anyobject, Anyobject)

后来我得到了这个错误

   var artworks = [Artwork]()
func loadInitialData() {
    // 1
    let fileName = Bundle.main.path(forResource: "PublicArt", ofType: "json");

    let data: Data = try! Data(contentsOf: URL(fileURLWithPath: fileName!), options: NSData.ReadingOptions(rawValue: 0))

    // 2
    var error: NSError?
    let jsonObject: AnyObject!
    do {
        jsonObject = try JSONSerialization.jsonObject(with: data,
                    options: JSONSerialization.ReadingOptions(rawValue: 0))
    } catch let error1 as NSError {
        error = error1
        jsonObject = nil
    }

    // 3
    if let jsonObject = jsonObject as? [String: AnyObject], error == nil,
        // 4
        let jsonData = JSONValue.fromObject(jsonObject)?["data"]?.array {
            for artworkJSON in jsonData {
                if let artworkJSON = artworkJSON.array,
                    // 5
                    let artwork = Artwork.fromJSON(artworkJSON) {
                        artworks.append(artwork)
                }
            }
    }
}     

JsonObject 产生 'Any' 不是预期的上下文结果类型 '任何对象'

参数类型 [String : AnyObject] 不符合预期类型 '任何对象'

我假设这是一个简单的过程,但我已经一年没有编写代码了,非常感谢您的帮助

谢谢

特拉维斯

更新

所以我刚刚更新了代码

但在 JSON.swift 文件中出现错误

static func fromObject(_ object: AnyObject) -> JSONValue? {
    switch object {
    case let value as NSString:
      return JSONValue.jsonString(value as String)
    case let value as NSNumber:
      return JSONValue.jsonNumber(value)
    case _ as NSNull:
      return JSONValue.jsonNull
    case let value as NSDictionary:
      var jsonObject: [String:JSONValue] = [:]
      for (k, v): (AnyObject, AnyObject) in value {
        if let k = k as? NSString {
          if let v = JSONValue.fromObject(v) {
            jsonObject[k as String] = v
          } else {
            return nil
          }
        }
      }
      return JSONValue.jsonObject(jsonObject)
    case let value as NSArray:
      var jsonArray: [JSONValue] = []
      for v in value {
        if let v = JSONValue.fromObject(v as AnyObject) {
          jsonArray.append(v)
        } else {
          return nil
        }
      }
      return JSONValue.jsonArray(jsonArray)
    default:
      return nil
    }
  }

}

错误是:

nsdictionary.iterate.element '(aka (key: Any, value: Any)') 不是 可转换为 'AnyObject, AnyObject)'

代码行

 for (k, v): (AnyObject, AnyObject) in value {

抱歉回复晚了

问候

特拉维斯

【问题讨论】:

  • 下半场的错误分别在//2和//4

标签: ios swift xcode


【解决方案1】:

你使用了太多 AnyObject aka it's-an-object-but-I-don't-know-the-type

由于 JSON 文件在您的包中,您可以准确地知道所有对象的类型。

在 Swift 3 中,JSON 字典是 [String:Any],JSON 数组是 [[String:Any]]

但是我不知道 JSON 的确切结构,也不知道 JSONValue 做了什么——实际上不需要第三方库——但这可能是获取键 @ 数组的起点987654325@.

func loadInitialData() {

    let fileURL = Bundle.main.url(forResource: "PublicArt", withExtension: "json")!

    do {
        let data =  try Data(contentsOf: fileURL, options: [])

        let jsonObject = try JSONSerialization.jsonObject(with: data) as! [String: Any]
        let jsonData = jsonObject["data"] as! [[String:Any]]
        for artworkJSON in jsonData {
            print(artworkJSON)
            // ... create Artwork items
        }
    } catch {
        print(error)
        fatalError("This should never happen")
    }
}

【讨论】:

  • 嗨,我刚试过这个。这有效,但我刚刚意识到的 JSON.swift 文件中仍有错误
  • 考虑到 Swift 3 中未指定的 JSON 类型是 Any
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2017-08-05
相关资源
最近更新 更多