Что '!' а также '?' знаки, используемые в Swift
Когда я изменился с Objective-C
в Swift
программирование, я сталкивался!
"(восклицательный знак) и"?
' (знак вопроса), который часто нужно ставить сразу после property
, method
Позвоните и т. д. Для чего используются эти метки и что произойдет, если мы их не использовали?
Я искал подробный ответ в Интернете, но не смог найти ни одного. Поэтому я решил поставить здесь свой ответ на случай, если кто-то ищет четкий ответ для этого.
Я также включил в свой ответ ниже ссылку на вопрос, похожий на мой, где вы можете найти дальнейшее объяснение того, как и где вы можете использовать эти знаки (то есть "!" И "?"). Мой вопрос спрашивает, и мой ответ объясняет на более базовом уровне, чем аналогичный вопрос в ссылке.
2 ответа
Терминология, используемая для этих знаков Optional Chaining
, Они обычно используются для различения случаев, например, property
это method call
возвращается nil
,
Пример объясняется в руководстве по языку Apple дляOptional Chaining
является хорошим, чтобы показать цель их использования:
Во-первых, два класса под названием
Person
а такжеResidence
определены:class Person { var residence: Residence? } class Residence { var numberOfRooms = 1 } Residence instances have a single `Int` property called `numberOfRooms`, with a default value of **1**. `Person` instances
иметь дополнительный
residence
свойство типаResidence
?.Если вы создаете новый
Person
Например, егоresidence
свойство по умолчанию инициализируетсяnil
в силу того, что не является обязательным. В приведенном ниже кодеjohn
имеетresidence
стоимость имуществаnil
:let john = Person()
Если вы попытаетесь получить доступ к
numberOfRooms
собственность этого человекаresidence
, поместив восклицательный знак послеresidence
чтобы принудительно развернуть его значение, вы вызываете ошибку времени выполнения, потому что нетresidence
значение, чтобы развернуть:let roomCount = john.residence!.numberOfRooms // this triggers a runtime error
Код выше успешно, когда
john.residence
имеет ненулевое значение и будет устанавливатьroomCount
дляInt
значение, содержащее соответствующее количество номеров. Тем не менее, этот код всегда вызывает ошибку времени выполнения, когдаresidence
являетсяnil
, как показано выше.Необязательное сцепление обеспечивает альтернативный способ доступа к значению
numberOfRooms
, Чтобы использовать необязательную цепочку, используйте знак вопроса вместо восклицательного знака:if let roomCount = john.residence?.numberOfRooms { print("John's residence has \(roomCount) room(s).") } else { print("Unable to retrieve the number of rooms.") } // Prints "Unable to retrieve the number of rooms."
Это говорит Swift "цепочка" на опциональном
residence
свойство и получить значениеnumberOfRooms
еслиresidence
существует.Потому что попытка доступа
numberOfRooms
может потерпеть неудачу, дополнительная попытка создания цепочки возвращает значение типаInt?
или "необязательный In t". когдаresidence
являетсяnil
как в примере выше, это необязательноInt
также будетnil
, чтобы отразить тот факт, что не было возможности получить доступnumberOfRooms
, НеобязательныйInt
доступ через необязательную привязку, чтобы развернуть целое число и присвоить неопциональное значениеroomCount
переменная.Обратите внимание, что это правда, хотя
numberOfRooms
это неопциональныйInt
, Тот факт, что он запрашивается через необязательную цепочку, означает, что вызовnumberOfRooms
всегда будет возвращатьInt?
вместоInt
,Вы можете назначить
Residence
экземпляр дляjohn.residence
так что у него больше нетnil
значение:john.residence = Residence()
Помимо общего обзора дополнительного цепочки выше, вы можете посмотреть на этот ответ в Stackru.
Надеюсь, что это дает вам некоторое представление о необязательной цепочке.
Проще говоря, добавление
!
означает, что вы на 100% гарантированно дадите значение.... если вы добавите "!" и не указывайте значение, приложение будет аварийно завершать, говоря, что вернуло значение ноль (или что-то в этом роде).....
?
означает, что вы можете вернуть значение... это лучший способ сделать что-то, если вы можете помочь ему...