我有一个小功能,"应该"改变了uilabel的文本,但我对如何从if语句中获取未包装的值感到兴奋。
func update() {
var strAddress = "test"
IP.getIpAddress { (data) -> Void in
let json = JSON(data: data)
if let address = json["ip"].string {
println("address: \(address)")
strAddress = (address)
} else {
println("not unwrapped")
}
}
self.lblIpAddress.text = strAddress
}
json [" ip"]的结果正常,所以假设println显示"地址:xxx.xxx.xxx.xxx"。我的麻烦不是这样,它试图分配常数"地址"到变量strAddress。
我甚至试图将strAddress静态设置为" test"在if之内,但它仍然没有改变。
有什么想法吗?
答案 0 :(得分:0)
声明
strAddress = (address)
尝试将单元素元组分配给strAddress。 (假设地址是一个字符串,它是(String)
类型的元组。
去除括号,然后假设address
的类型为String
答案 1 :(得分:0)
您的IP.getIPAddress似乎异步调用闭包,这意味着它将在队列中的所有内容完成后执行。
所以在你的函数中,它在...... {/ p>之前到达self.lblIpAddress.text = strAddress
{ (data) -> Void in
let json = JSON(data: data)
if let address = json["ip"].string {
println("address: \(address)")
strAddress = (address)
} else {
println("not unwrapped")
}
}
...已执行。
为了让你的工作像你想要的那样,你必须把self.lblIpAddress.text = strAddress
放在那个闭包里。
IP.getIpAddress { (data) -> Void in
let json = JSON(data: data)
if let address = json["ip"].string {
println("address: \(address)")
strAddress = (address)
} else {
println("not unwrapped")
}
dispatch_async(dispatch_get_main_queue()) { // Make sure its called on the main thread
self.lblIpAddress.text = strAddress
}
}