变量不断返回 nil - Swift iOS
Posted
技术标签:
【中文标题】变量不断返回 nil - Swift iOS【英文标题】:Variable keeps returning nil - Swift iOS 【发布时间】:2015-08-24 20:24:38 【问题描述】:我正在使用 Alamofire 解析 JSON 数据。除了 'var id: JSON?' 在下面提到的代码中一切正常变量虽然更新得很好,但它在某个点(在底部)一直返回 nil 。我需要将此变量放入过滤器闭包中。
class GreetingObjectHandler
var greetings: [Greeting] = []
var id: JSON? //this variable
init(filename: String)
Alamofire.request(.GET, "http://localhost:2403/users/me")
.responseJSON (req, res, data, error) in
if(error != nil)
NSLog("Error: \(error)")
else
var parse = JSON(data!)
self.id = parse["id"] //updating
println(self.id) //it's fine here
let filePath = NSURL(string: "http://localhost:2403/users")
let jsonData = NSData(contentsOfURL:filePath!)
let json = JSON(data: jsonData!, options: NSJSONReadingOptions.AllowFragments, error: nil)
for (key: String, subJson: JSON) in json
var language:String?, link: String?, description:String?, greetingText: String?
for (key1, value:JSON) in subJson
switch key1
case "displayName": language = value.string
case "id": link = value.string
case "username": description = value.string
case "mainSkill": greetingText = value.string
default: break
let greeting = Greeting(language: language, link: link, description: description, greetingText: greetingText)
self.greetings.append(greeting)
self.greetings = self.greetings.filter $0.link != "\(self.id)" //this filter
println(self.id) //returns nil
func getGreetingsAsAnyObjects() -> [String: [AnyObject]]
return [Constant.GreetingOBJHandlerSectionKey: greetings.map $0 as AnyObject ]
【问题讨论】:
request() 是一个异步操作。如果不向它们添加一些内容,例如 println("1 (self.if)"),您将无法知道首先调用哪一行 它返回 nil 是因为它在主线程上运行并且请求操作尚未成功完成为 id 属性赋值。 【参考方案1】:尽管人们的 cmets 很好地解释了您的问题,但我认为使用闭包创建一个函数来处理您的请求,然后在完成处理程序中处理其余的可以帮助您组织代码,例如方式如下:
func getJSON(url: String, completionHandler: (json: JSON?, error: NSError?) -> ())
Alamofire.request(.GET, url)
.responseJSON (req, res, data, error) in completionHandler(
json:
if let d = data
var parse = JSON(d)
return parse
return nil
(), error: error)
然后您可以通过以下方式拨打您的init
:
init(filename: String)
self.getJSON("http://localhost:2403/users") json, error in
if(error != nil)
NSLog("Error: \(error)")
else
self.id = json["id"]
let filePath = NSURL(string: "http://localhost:2403/users")
let jsonData = NSData(contentsOfURL:filePath!)
let json = JSON(data: jsonData!, options: NSJSONReadingOptions.AllowFragments, error: nil)
for (key: String, subJson: JSON) in json
var language:String?, link: String?, description:String?, greetingText: String?
for (key1, value:JSON) in subJson
switch key1
case "displayName": language = value.string
case "id": link = value.string
case "username": description = value.string
case "mainSkill": greetingText = value.string
default: break
let greeting = Greeting(language: language, link: link, description: description, greetingText: greetingText)
self.greetings.append(greeting)
self.greetings = self.greetings.filter $0.link != "\(self.id)" //this filter
println(self.id)
通过上面的代码,您可以使用闭包来确保您的请求已完成。
希望对你有所帮助。
【讨论】:
它没有通过。 @SatnamSync “它没有通过”是什么意思【参考方案2】:Alamofire 请求异步运行,因此 init 函数末尾的 println
语句在 responseJSON
闭包末尾的 println
语句之前运行。解决此问题的方法是在 responseJSON
闭包中运行需要 json
变量的代码。
【讨论】:
【参考方案3】:你所有的建议都是有效的,但这确实有效。
import Foundation
import Alamofire
class GreetingObjectHandler
var greetings: [Greeting] = []
init(filename: String)
let fileP = NSURL(string: "http://localhost:2403/users/me")
let jsonD = NSData(contentsOfURL:fileP!)
let jso = JSON(data: jsonD!, options: NSJSONReadingOptions.AllowFragments, error: nil)
var id = jso["id"]
let filePath = NSURL(string: "http://localhost:2403/users")
let jsonData = NSData(contentsOfURL:filePath!)
let json = JSON(data: jsonData!, options: NSJSONReadingOptions.AllowFragments, error: nil)
for (key: String, subJson: JSON) in json
var language:String?, link: String?, description:String?, greetingText: String?
for (key1, value:JSON) in subJson
switch key1
case "displayName": language = value.string
case "id": link = value.string
case "username": description = value.string
case "mainSkill": greetingText = value.string
default: break
let greeting = Greeting(language: language, link: link, description: description, greetingText: greetingText)
self.greetings.append(greeting)
self.greetings = self.greetings.filter $0.link != "\(id)"
func getGreetingsAsAnyObjects() -> [String: [AnyObject]]
return [Constant.GreetingOBJHandlerSectionKey: greetings.map $0 as AnyObject ]
【讨论】:
以上是关于变量不断返回 nil - Swift iOS的主要内容,如果未能解决你的问题,请参考以下文章
Swift 5 API 调用数据变量 nil 但 API 证明有效
(iOS Swift) 从 Core Data 获取记录返回致命错误或 nil
Swift - 在展开可选值时意外发现 nil - 从委托调用变量
访问 https json api 每次都返回 nil (Swift)