Я новичок в быстром, и я действительно не понимаю, как правильно использовать опциональное значение.Confused о необязательном значении в 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 для получения значений из сервера и обновления пользовательского интерфейса. Код:
class UserViewController: UIViewController {
@IBOutlet var nameLabel: UILabel!
var user = User()
override func viewDidLoad() {
super.viewDidLoad()
user.getInfo({
nameLabel.text = user.name!
})
}
}
Я думаю, что это опасный способ справиться с этой работой, потому что нет ничего может гарантировать, что у меня есть определенное имя, когда я хочу поставить его на этикетке. Он работает очень хорошо в большинстве случаев, но может потерпеть крах, когда не получается получить правильное значение с сервера (например, для ключа «имя» нет значения).
У меня есть две идеи о вопросах выше:
- Дайте значение по умолчанию для свойства, как:
var name = ""
Теста значение до unwarp это нравится:
if let foo = user.name { nameLabel.text = foo }
Я хочу выбрать первый путь, потому что:
- Я думаю, что показать строку по умолчанию на ярлыке гораздо более приемлемо, чем сбой, потому что не удалось опознать необязательное значение.
- Когда у меня есть намного больше значений для использования, код будет очень длинным и отличным для чтения.
Я выбрал правильный вариант? Или оба они не понимали использование необязательной ценности, и есть лучший способ? Кто-то может мне помочь?
Одна вещь, которую я могу сразу придумать из коробки, заключается в том, что вы выделяете память переменным, которые могли бы иметь значения nil. Следовательно, вы выделяете больше памяти, чем вам когда-либо понадобится. (Это распределение может быть неинтересным, но факт должен быть рассмотрен) – Harsh
Вы не хотите использовать подход по умолчанию ('var name =" "'). Необязательная привязка ('if let name = user.name {nameLabel.text = name}') к _unwrap_ необязательно - это, безусловно, путь. Или используйте оператор 'nil' colaescing,' ?? ', как показал pbrush25. Но вопрос «что мне показывать, когда нет имени» - это вопрос пользовательского интерфейса (сделанный при установке «текста» метки), а не то, что вы обычно хотели бы встроить в модель. Наличие «nil» необязательно в модели, когда нет данных, это правильный подход. – Rob