iOS swift-使用API的响应
我对Swift和iOS开发非常陌生。如果我使用JavaScript,我想知道如何做一些相对简单的事情 我正在调用一个API,该API返回以下内容。请原谅格式化,但它是直接从Xcode控制台复制的iOS swift-使用API的响应,ios,json,swift,nsjsonserialization,Ios,Json,Swift,Nsjsonserialization,我对Swift和iOS开发非常陌生。如果我使用JavaScript,我想知道如何做一些相对简单的事情 我正在调用一个API,该API返回以下内容。请原谅格式化,但它是直接从Xcode控制台复制的 ["type": success, "value": <__NSArrayI 0x600000030340>( { categories = (); id = 155; joke = "Chuck Norris doe
["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).";
}
)
]
它不必完全像上面那样。我相信在swift中使用循环并将其附加到数组中。我正在努力访问API返回的值
数组中的笑话
我的控制器如下所示:
let jokes = [];
response.value.forEach(item => {
jokes.push(item.joke)
})
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()
}
}
你可以试试
if let va = json["value"] as? [[String:Any]] {
va.forEach { print($0["joke"]) }
}
我更愿意为此编写一个Codable
structs
struct Root: Codable {
let type: String
let value: [Value]
}
struct Value: Codable {
let categories: [Category]
let id: Int
let joke: String
}
struct Category: Codable {
}
正如您从日志中看到的,变量json[“value”]属于NSArray类型,因此您可以执行类似的操作来获取数据(有很多方法可以做到这一点) 首先,你可以像这样创造一个笑话
class Joke: NSObject {
var categories = [String]()
var id: Int?
var joke: String?
init(json: [String: Any]) {
if let categories = json["categories"] as? String {
for category in categories {
self.categories.append(category)
}
}
if let id = json["id"] as? Int {
self.id = id
}
if let joke = json[""] as? String {
self.joke = joke
}
}
}
然后在ViewController中执行此操作
class ViewController: UIViewController {
var jokes = [Joke]()
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
let arrayOfObject = json["value"] as! NSArray
for object in arrayOfObject {
if let json = object as? [String: Any] {
let object = Joke(json: json)
// Now you have your object containing the data from the JSON and you can insert it in your array of Object
jokes.append(object)
}
}
} catch let error as NSError {
print(error)
}
}).resume()
}
}
记住,有很多方法可以做到这一点,我向您展示了一种简单的方法,希望它会有所帮助。这很有效,谢谢。这在iOS/swift中不是很常见的任务吗?正如在web开发中一样。是否有一种我不知道的获取移动应用程序中使用的数据的不同方法?另外,你介意告诉我你将如何采用
struct
方法吗?这在JS中很容易,而且在Swift中还有额外的工作,因为你处于类型化和非类型化行为之间的边界。JS&JSON-非类型化。Swift希望在读取JSON时添加一些输入<代码>任何在没有强制转换的情况下都不是那么有用。有几个框架可以提供帮助(例如SwiftyJSON),而Swift本身也添加了可编码/可解码。太好了,知道@Gracks这一切太棒了。只是一个问题——假设一个基于web React的生产应用程序可能会进行大量API调用,并将这些数据存储在redux商店中。iOS开发是否也有类似的方法,或者我还应该注意其他什么?这是一个完全不同的问题。。。我通常采取两种方法中的一种。解析并将下载的数据插入SQLite,如果需要的话。或者像redux一样将其存储在RAM中,例如使用singleton JokeManager类,该类可以将JSON派生的dict[String:Any]
解析为一些有用的Swift对象。然后用户界面或其他任何东西可以根据需要从JokeManager.shared中提取笑话。这当然是另一个问题,但感谢您的回答。给了我一些需要研究的东西:-D--但是你建议的是用于生产应用程序的方法?顺便说一下,SwiftyJSON看起来很棒
class ViewController: UIViewController {
var jokes = [Joke]()
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
let arrayOfObject = json["value"] as! NSArray
for object in arrayOfObject {
if let json = object as? [String: Any] {
let object = Joke(json: json)
// Now you have your object containing the data from the JSON and you can insert it in your array of Object
jokes.append(object)
}
}
} catch let error as NSError {
print(error)
}
}).resume()
}
}