我是iOS开发的新手,并且一直试图迅速进入。我正在尝试使用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
}
}
答案 0 :(得分:0)
您的班级Album
没有名为albumId
的属性,这意味着该密钥不符合KVC。
您的JSON响应似乎有一个键“albumId”,但由于您的类不符合KVC(它没有“albumId”属性)使用setValuesForKeys
失败,因为setValuesForKeys
需要对于字典中的所有键,实例必须符合KVC。
如果没有关于JSON响应的一点知识,我们只能根据假设提出建议。
您的选择是:
在课程Album
上将属性“id”更改为“albumId”
更改您的API,以便JSON密钥只是“id”
覆盖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) }