[<testingapi.album 0x6100000ff300 =“”> setValue:forUndefinedKey:]:此类不是密钥值编码兼容的keyAld

时间:2017-08-14 12:20:12

标签: ios iphone

我是iOS开发的新手,并且一直试图迅速进入。我正在尝试使用API​​并尝试自学。我已经构建了这个测试集合视图以及模型以获取数据,但是当我运行应用程序时,我遇到了崩溃。一直想找到一个没有运气的解决方案。

我发现很少有同样的崩溃,但主要是由于我没有使用的xib文件。我只在代码中构建应用程序。

ALBUMID

import UIKit

class AlbumId: NSObject {

    var albumId: NSNumber?

    static func fetchAlbums() {

        let urlString = "https://jsonplaceholder.typicode.com/photos"
        let url = URL(string: urlString)

        URLSession.shared.dataTask(with: url!) { (data, response, error) in

            if error != nil {
                print(error ?? "")
                return
            }

            do {

                let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers)

                var albums = [Album]()

                for dict in json as! [Any] {
                    let album = Album(dictionary: dict as! [String: Any])
                    album.setValuesForKeys(dict as! [String : Any])
                    albums.append(album)
                }

            } catch let err {
                print(err)
            }

            }.resume()

    }
}

相册

class Album: NSObject {
    var id: NSNumber?
    var title: String?
    var url: String?
    var thumbnailUrl: String?

    init(dictionary: [String: Any]) {
        super.init()

        id = dictionary["id"] as? NSNumber
        title = dictionary["title"] as? String
        url = dictionary["url"] as? String
        thumbnailUrl = dictionary["thumbnailUrl"] as? String
    }
}

2 个答案:

答案 0 :(得分:0)

您的班级Album没有名为albumId的属性,这意味着该密钥不符合KVC

您的JSON响应似乎有一个键“albumId”,但由于您的类不符合KVC(它没有“albumId”属性)使用setValuesForKeys失败,因为setValuesForKeys需要对于字典中的所有键,实例必须符合KVC。

如果没有关于JSON响应的一点知识,我们只能根据假设提出建议。

您的选择是:

  1. 在课程Album上将属性“id”更改为“albumId”

  2. 更改您的API,以便JSON密钥只是“id”

  3. 覆盖setValueForKey并将“albumId”重定向到您的“id”属性。

答案 1 :(得分:0)

发生错误是因为模型不包含属性albumId

无论如何,调用KVC方法setValuesForKeys是多余的,因为您正在从字典初始化对象。在Swift中只有少数罕见的情况,KVC很有用。这不是他们中的任何一个。实际上也不需要继承NSObject

收到的JSON包含id albumId个键,因此将后者添加到模型中并使用Int而不是NSNumber。此代码使用非可选常量(let),默认值为空字符串/ 0

class Album {
    let albumId : Int
    let id: Int
    let title: String
    let url: String
    let thumbnailUrl: String

    init(dictionary: [String: Any]) {

        albumId = dictionary["albumId"] as? Int ?? 0
        id = dictionary["id"] as? Int ?? 0
        title = dictionary["title"] as? String ?? ""
        url = dictionary["url"] as? String ?? ""
        thumbnailUrl = dictionary["thumbnailUrl"] as? String ?? ""
    }
}

现在填充albums数组一如既往.mutableContainers在Swift中完全没有意义

   if let json = try JSONSerialization.jsonObject(with: data!) as? [[String: Any]] else { return }

   var albums = [Album]()

   for dict in json {
       let album = Album(dictionary: dict)
       albums.append(album)
   }

或以 swiftier 方式

  var albums = json.map { Album(dictionary: $0)  }