У меня есть функция под названием getEarthquake()
, который анализирует JSON с помощью SwiftyJSON и возвращает все организованной информации (например, title
, magnitude
и time
) в NSMutableArray
называется info
.Вызов функции внутри функции и возвращает строку
var info = NSMutableArray()
func getEarthquake(completion: (results : NSMutableArray) ->Void) {
DataManager.getEarthquakeDataFromFileWithSuccess {
(data) -> Void in
let json = JSON(data: data)
if var JsonArray = json.array {
JsonArray.removeAtIndex(0)
for appDict in JsonArray {
var mag: String? = appDict["mag"].stringValue
var title: String? = appDict["title"].stringValue
var time: String? = appDict["time"].stringValue
var information = AppModel(title: title, magnitude: mag, time1: time)
info.addObject(information)
// info.removeRange(3...48)
completion(results: info)
}
}
}
}
Я создал другую функцию под названием getEarthquake2()
которая вызывает getEarthquake()
и извлекающий info
. В getEarthquake2()
Я хочу, чтобы он возвращал только title1
, что является String
. Однако мои попытки приводят только к title1
: nil
к моменту возврата.
func getEarthquake2()->String? {
var title1: String?
getEarthquake{ (info) in
var title = info[0].title
title1 = title
}
return title1
}
Может кто-то направить меня в нужном направлении при внесении getEarthquake2()
успешно вернуться title1
, которая не возвращает ноль? (Я уверен, что это не вопрос Info
будучи ноль, так как она их получает в конце getEarthquake()
.)
Мой AppModel.swift файл, где я могу легко организовать мой код:
import Foundation
class AppModel: NSObject, Printable {
let title: String
let magnitude: String
let time1: String
override var description: String {
return "TITLE: \(title), TIME: \(time1), MAG: \(magnitude)"
}
init(title: String?, magnitude: String?, time1: String?) {
self.title = title ?? ""
self.time1 = time1 ?? ""
self.magnitude = magnitude ?? ""
}
}
Мои DataManager.swift файл, в котором я называю веб-сервис:
import Foundation
let earthquakeURL = "http://www.kuakes.com/json/"
class DataManager {
class func getEarthquakeDataFromFileWithSuccess(success: ((websiteData: NSData) -> Void)) {
//1
loadDataFromURL(NSURL(string: earthquakeURL)!, completion:{(data, error) -> Void in
//2
if let urlData = data {
//3
success(websiteData: urlData)
}
else {
println("nothing")
}
})
}
class func loadDataFromURL(url: NSURL, completion:(data: NSData?, error: NSError?) -> Void) {
var session = NSURLSession.sharedSession()
// Use NSURLSession to get data from an NSURL
let loadDataTask = session.dataTaskWithURL(url, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
if let responseError = error {
completion(data: nil, error: responseError)
} else if let httpResponse = response as? NSHTTPURLResponse {
if httpResponse.statusCode != 200 {
var statusError = NSError(domain:"com.kuakes", code:httpResponse.statusCode, userInfo:[NSLocalizedDescriptionKey : "HTTP status code has unexpected value."])
completion(data: nil, error: statusError)
} else {
completion(data: data, error: nil)
}
}
})
loadDataTask.resume()
}
}
Прошу прощения, я набрал свой вопрос в спешке, и я неправильно задал свой вопрос. My bad :(Заголовок не возвращает nil, он успешно заполняется из моего информационного массива. Моя проблема в том, что title1 возвращает nil в конце 'getEarthquake2()'. Любая идея, как я могу это исправить? – videoperson
@videoperson, но это doesn 't return 'nil' для меня, пожалуйста, проверьте это на игровой площадке Xcode: https://gist.github.com/marcioadr88/65a5b210b960e52f987f –