[<TestingAPI.Album 0x6100000ff300> setValue:forUndefinedKey:]:此类不符合键值编码的键 albumId



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

我见过很少有相同的崩溃,但主要是由于我没有使用的 xib 文件。我只用代码构建应用程序。

专辑编号

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
}
}

>您的类Album没有名为albumId的属性,这意味着它不符合该键的KVC。

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

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

您的选择是:

  1. 将类Album上的属性"id"更改为"albumId"

  2. 更改您的 API,使 JSON 密钥只是"id">

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

发生此错误的原因是模型不包含属性albumId

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

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

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)
}

或以更快捷的方式

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

相关内容

最新更新