我是swift的新手,我不太了解如何正确使用可选值。关于swift中的可选值的困惑
情况是:首先,我有一个模型类来存储其属性的一些值,并将请求发送到服务器以获取值。代码:
import Foundation
class User: NSObject {
var name: String?
func getInfo(updateUI:() ->()) {
let manager = AFHTTPSessionManager()
manager.POST(URLString, parameters: nil, success: { (task: NSURLSessionDataTask, responseObject: AnyObject?) in
let dic = responseObject as? NSDictionary
self.name = dic?.objectForKey("name")
updateUI()
}, failure: { (task: NSURLSessionDataTask?, error: NSError) in
log.obj(error)
})
}
其次,我想用这个模型中的ViewController从服务器和更新UI获得的值。代码:
class UserViewController: UIViewController {
@IBOutlet var nameLabel: UILabel!
var user = User()
override func viewDidLoad() {
super.viewDidLoad()
user.getInfo({
nameLabel.text = user.name!
})
}
}
我想这是因为没有什么能保证我有一定的名字时,我希望把它在标签上处理这种工作危险的方式。它在大多数情况下工作得很好,但是如果无法从服务器获得正确的值(例如,键名“name”没有值),它可能会崩溃。
我有两个想法有关上述问题:
- 给像属性的默认值:unwarp前值
var name = ""
测试它想:
if let foo = user.name { nameLabel.text = foo }
我想选择第一种方式,因为:
- 我认为在标签上显示的默认字符串比崩溃更可接受,因为未能取消任意值。
- 当我有更多的使用价值时,代码将非常漫长,难以阅读。
我选择了合适的吗?或者他们都不了解可选值的用法,有更好的方法吗?有人可以帮助我吗?
我可以马上想到的一件事就是你将内存分配给可能以零值结束的变量。因此,你正在分配比你需要的更多的内存。 (这个分配可能是不重要的,但是需要考虑的事实) – Harsh
你不想做默认值方法('var name =“”')。可选的绑定('如果let name = user.name {nameLabel.text = name}')_unwrap_可选肯定是要走的路。或者使用'nil' colaescing操作符''',就像pbrush25给你看的那样。但是“没有名字时应该显示什么”问题是用户界面问题(在设置标签的“文本”时完成),而不是您通常希望构建到模型中的内容。在没有数据的情况下,在模型中使用'nil'是正确的方法。 – Rob