【发布时间】:2019-04-25 05:43:14
【问题描述】:
我对 Swift 和 iOS 开发非常陌生。如果我使用 JavaScript,我想知道如何做一些相对简单的事情。
我正在调用返回以下内容的 API。请原谅格式化,但它是直接从 Xcode 控制台复制的。
["type": success, "value": <__NSArrayI 0x600000030340>(
{
categories = ();
id = 155;
joke = "Chuck Norris does not "style" his hair. It lays perfectly in place out of sheer terror.";
},
{
categories = (nerdy);
id = 69;
joke = "Scientists have estimated that the energy given off during the Big Bang is roughly equal to 1CNRhK (Chuck Norris Roundhouse Kick).";
}
)
]
我想遍历响应并添加到数组中。在 JavaScript 中,它如下所示:
let jokes = [];
response.value.forEach(item => {
jokes.push(item.joke)
})
不必与上述完全相同。我有信心快速使用循环并附加到数组中。我正在努力做的是访问从 API 返回的 value 数组中的笑话。
我的控制器如下所示:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: "http://api.icndb.com/jokes/random/2")
URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in
guard let data = data, error == nil else { return }
do {
let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:Any]
print(json["value"])
// not sure how to access each joke in the array here
} catch let error as NSError {
print(error)
}
}).resume()
}
}
【问题讨论】:
-
这在 JS 中很容易,而且在 Swift 中还有额外的工作,因为你处于类型化行为和非类型化行为之间的边界。 JS & JSON - 无类型。 Swift 想在读取 JSON 时添加一些类型;
Any没有强制转换就不是那么有用。有几个框架可以提供帮助(例如 SwiftyJSON),Swift 本身也添加了 Codable/Decodable。 -
太好了,知道@GrahamPerks 真是太好了。只是一个问题 - 假设基于生产 Web React 的应用程序可能会进行大量 API 调用并将这些数据存储在 redux 存储中。 iOS 开发是否有一些类似的方法,或者我应该注意什么?
-
这完全是另一个问题......我通常采用两种方法之一。解析并将下载的数据插入 SQLite,如果我需要它持久。或者像 redux 一样将其存储在 RAM 中,例如使用单例 JokeManager 类,它可以将 JSON 派生的字典
[String:Any]解析为一些有用的 Swift 对象。然后用户界面或任何可以根据需要从JokeManager.shared中提取笑话。 -
这肯定是另一个问题,但感谢您的回答。给了我一些研究:-D——但你建议的是用于生产应用程序的方法?
-
顺便说一句,SwiftyJSON 看起来很棒
标签: ios json swift nsjsonserialization