Swift 4 Playground(MacOS)新手求助:获取远程JSON的title值失败
解决Swift Playground中解码远程JSON数组获取title的问题
嘿,我一眼就看出问题啦!你请求的远程JSON是一个Post对象数组,但你却尝试把它解码成单个Post实例,这就是为什么print(object.title)没输出预期结果——其实解码过程已经抛出错误了,只是你把error的打印注释掉了,所以没发现~
问题核心
你调用的接口返回的是这样的结构(简化版):
[ {"userId": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "..."} // 更多Post对象... ]
是一个数组,不是单个Post对象,所以用decoder.decode(Post.self, from: jsonData)会直接触发错误分支。
修改后的完整代码
我标注了关键修改点,你可以直接运行测试:
import Foundation import PlaygroundSupport PlaygroundPage.current.needsIndefiniteExecution = true // Create structer of Post struct Post: Codable { var userId: Int var title: String var body: String } // Remote JSON to Structed Object let url = URL(string: "https://jsonplaceholder.typicode.com/posts")! do { let jsonData = try Data(contentsOf: url) let decoder = JSONDecoder() // 关键修改:解码成Post数组类型 [Post].self let posts = try decoder.decode([Post].self, from: jsonData) // 安全获取第一个元素的title(处理数组为空的边界情况) if let firstTitle = posts.first?.title { print("第一个Post的title:\(firstTitle)") } else { print("数组为空,没有找到title") } } catch { // 建议保留错误打印,方便调试解码问题 print("解码错误:\(error)") }
额外小提示
- 永远不要忽略错误捕获,注释掉
print(error)会让你错过关键的调试信息 - 使用
posts.first?.title这种可选链写法,能避免数组为空时触发崩溃
内容的提问来源于stack exchange,提问作者user7890002
相关产品推荐
相关产品推荐

