#class #types #uilabel #swift5 #xcode11
#класс #типы #uilabel #swift5 #xcode11
Вопрос:
всякий раз, когда я захожу в Интернет или проверяю проекты в режиме онлайн при создании любого объекта в классе ViewController, я вижу восклицательный знак (!) в конце типа данных, почему это? для example:@IBOutlet слабая метка переменной: UILabel! итак, почему это ‘!’ или почему мы принудительно разворачиваем его? А также, когда я удаляю его, он выдает ошибку , мы также можем написать так @IBOutlet weak var Label=UILabel() так почему бы нам не использовать это?
Ответ №1:
Вам нужно понимать все шаг за шагом, чтобы получить ответ.
- @IBOutlet: Это оболочка свойств, которая сообщает Xcode соединить элемент в раскадровке с элементом в
.swift
файле. !
Пометка: рекомендуется принудительное разворачивание, потому что, когда.swift
файлу понадобится экземпляр, он обязательно найдет связанный элемент в раскадровке. Мы также можем написать @IBOutlet слабую метку переменной: UILabel? В этом случае экземплярLabel
был бы необязательным.- @IBOutlet слабая переменная Label=UILabel(): в этом случае
Label's
значение экземпляра заменяется наUILabel()
сразу после инициализации.@IBOutlet weak var Label!
иLabel
послеLabel = UILabel()
— это разные экземпляры.
@IBOutlet weak var label: UILabel
эквивалентно записи var label: UILabel
. Следовательно, i-val не имеет начального значения, и Swift этого не допускает. В Swift либо вы должны присвоить значение переменной, либо сделать его необязательным / развернутым, чтобы явно обрабатывать нулевые значения. А также, когда вы разворачиваете экземпляр с помощью @IBOutlet
, вы можете использовать его с ?
позже, как label?.text = "Some text"
.
Итак, мы вынуждены использовать !
или ?
для выхода, чтобы явно сделать переменную необязательной, как и для других объявлений переменных. И мы не используем объявление = UILabel()
after, потому что оно переопределяет экземпляр, созданный из раскадровки (инициализированный NSCoder/Coder
из кончика).
Комментарии:
1. привет @KoushikMudi , var MapView:MKMapView! переопределить функцию loadView(){ MapView = MKMapView() } что касается этого кода, я также могу написать var MapView = MKMapView внутри loadView , вместо объявления его вне метода load view (я нашел этот код в книге)
2. Привет @YuvrajAgarkar Это определенно правильно писать таким образом. но здесь вы не инициализируете MapView из раскадровки. Это также будет применимо к примеру UILabel. Если вы не подключаете UILabel из раскадровки, это способ инициализировать и использовать классы UIView в файле .swift.
3. Рад помочь @YuvrajAgarkar