Что '!' а также '?' знаки, используемые в 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% гарантированно дадите значение.... если вы добавите "!" и не указывайте значение, приложение будет аварийно завершать, говоря, что вернуло значение ноль (или что-то в этом роде).....

?

означает, что вы можете вернуть значение... это лучший способ сделать что-то, если вы можете помочь ему...

Другие вопросы по тегам