почему нам нужно предварительно обернуть тип данных при создании объекта? Swift 5

#class #types #uilabel #swift5 #xcode11

#класс #типы #uilabel #swift5 #xcode11

Вопрос:

всякий раз, когда я захожу в Интернет или проверяю проекты в режиме онлайн при создании любого объекта в классе ViewController, я вижу восклицательный знак (!) в конце типа данных, почему это? для example:@IBOutlet слабая метка переменной: UILabel! итак, почему это ‘!’ или почему мы принудительно разворачиваем его? А также, когда я удаляю его, он выдает ошибку , мы также можем написать так @IBOutlet weak var Label=UILabel() так почему бы нам не использовать это?

Ответ №1:

Вам нужно понимать все шаг за шагом, чтобы получить ответ.

  1. @IBOutlet: Это оболочка свойств, которая сообщает Xcode соединить элемент в раскадровке с элементом в .swift файле.
  2. ! Пометка: рекомендуется принудительное разворачивание, потому что, когда .swift файлу понадобится экземпляр, он обязательно найдет связанный элемент в раскадровке. Мы также можем написать @IBOutlet слабую метку переменной: UILabel? В этом случае экземпляр Label был бы необязательным.
  3. @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