Высокая производительность на дополнительных элементах пользовательского интерфейса - PullRequest
0 голосов
/ 15 декабря 2018

Настройка UILabel в Swift Я могу сделать следующее

@IBOutlet var wLabel: UILabel!

или

@IBOutlet var wLabel: UILabel?

Настройка текста, который я могу сделать

wLabel.text = "..."

или, для последнего выполните

wLabel?.text = "..." // with a question mark for the optional

. Необязательное их сохранение поможет для случая, когда они неожиданно равны нулю, поскольку тогда он просто пропустит этот вызов и продолжит работу с кодом.Объявление их с помощью ! приведет к сбою приложения, если метка будет nil.

Теперь, почему бы вам не сделать все необязательным?Единственная причина, по которой я мог придумать, - это лучшая производительность.Должен ли я не использовать их как необязательные, если в моем приложении много элементов пользовательского интерфейса, поэтому их необязательность будет означать снижение производительности?Я не смог найти никакой информации по этому вопросу.

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Используете?в вашем аутлете сделает ваш код недоступным для отслеживания

Сбои очень хороши в некоторых сценариях, потому что если нет сбоев, становится очень трудно отследить даже небольшую ошибку.

Рассмотримпримеры @IBOutlet с !:

@IBOutlet var wLabel: UILabel!
wLabel.isEnabled = true

Просто удалите соединение с вашей этикеткой Outlet из раскадровки и запустите приложение, ваше приложение упадет на wLabel.isEnabled = true.Поскольку у вас произошел сбой, вы можете добраться до раскадровки и посмотреть, правильное ли соединение.В случае, если нет подключения, добавьте его и, черт возьми!Вы легко решили проблему.

Теперь рассмотрим примеры @IBOutlet с ?:

@IBOutlet var wLabel: UILabel?
wLabel?.isEnabled = true

Сделайте то же самое, просто удалите соединение с вашимИзвлеките ярлык из вашей раскадровки и запустите приложение, ваше приложение вообще не рухнет.Вы не сможете узнать об ошибке, поэтому ваш код станет беспорядочным и непостижимым.

Ребята из Apple были очень осведомлены о дополнительных возможностях, они по какой-то причине принудительно развернули @IBOutlet.И, конечно, нет никакой разницы в производительности между ! и ?

0 голосов
/ 15 декабря 2018

Если вы настраиваете что-то как розетку, это настраивается как необязательное принудительное развертывание (с восклицательным знаком !), потому что Swift требует, чтобы ваши классы инициализировали все свои свойства при создании объекта (то есть init метод называется).Розетки не создаются во время создания объекта, а назначаются позже, когда в ваш компонент загружаются данные xib или раскадровки.Принудительное развертывание необязательных опций - это, по сути, способ сказать, что вы гарантируете, что свойство будет инициализировано после вызова объекта init и до его использования.

При использовании любого из этих методов повышения производительности нет.Тип Optional? означает, что свойство может быть либо nil, либо иметь значение.Необязательное принудительное развертывание ! означает, что свойство гарантированно будет иметь значение при использовании.Поддержка этого зависит от разработчика, и использование такого свойства, если его значение равно nil, приведет к сбою.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...