Ответ 1
Там тонкая, но важная разница:
-
variable as? String
:variable
может быть любым типом, таким как массив, целое число и т.д. Вставить в строку, если это строка, в противном случае установитьnil
. -
variable as String?
:variable
являетсяString?
, но сохраняется в непрозрачном типе, таком какAnyObject?
, или это необязательная строка. Если это что-то другое, генерируется исключение времени выполнения.
Некоторые примеры:
var x: AnyObject? = "Test"
x as String? // OK, the result is an optional string
x as? String // OK, evaluates to an optional string
"string" as String? // OK, evaluates to optional string
x as? Int // OK, evaluates to nil, it not an Int
x as Int? // Runtime exception, it not castable to optional Int
Итак:
-
as? Type
означает: приведение к этому типу, если это возможно, в противном случае оценить значениеnil
-
as Type?
означает: отбрасывается в необязательныйType
, потому что я знаю его как необязательныйType
. Я понимаю, что если это не так, генерируется исключение времени выполнения
Однако реальная разница между as?
и as
: первая - попытка бросить, последняя - принудительная передача, в результате чего возникает ошибка времени выполнения, если это невозможно.
Обновление 14 декабря 2015 г.. Swift 1.2 существует 3 варианта оператора as
:
-
as?
- это попытка бросить, оцениваяnil
, если сбой при неудаче -
as!
является принудительным приведением, в результате чего возникает исключение во время выполнения, если сбой при отказе (это то, что ранее былоas
) -
as
теперь является особым типом приведения, используемым при литье в эквивалентные типы, обычно с мостиковыми типами, такими как SwiftString
иNSString
.