Есть ли разница между as? String
и as String?
в Swift? Если да, то какая разница и когда я должен использовать один против другого?
Swift: разница как String? как? строка
Ответ 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
.
Ответ 2
Из The Swift Programming Language
книги,
-
as
- это оператор литого типа, который мы используем для downcast дляsubclass
иas?
, используется для необязательной формы, когда мы не уверены в успешностиdowncast
. Рассмотрим следующий примерfor item in library { if let movie = item as? Movie { println("Movie: '(movie.name)', dir. (movie.director)") } else if let song = item as? Song { println("Song: '(song.name)', by (song.artist)") } }
Пример начинается с попытки downcast
текущего элемента в качестве Movie
. Поскольку item
является экземпляром MediaItem
, возможно, что он может быть Movie
; В равной степени также возможно, что это может быть Song
или даже базовый MediaItem.
-
String?
Anoptional value
либо содержит значение, либо содержитnil
, чтобы указать, что это значение отсутствует.
Отсюда
-
as? String
означает, что, когда вы не знаете, что у вас есть, вы считаете, что в качествеString
, но это может быть мнеInteger
илиFloat
илиArray
илиDictionary
-
as String?
означает, что онoptional value
, он может содержать либо значениеString
, либоnil
.
Ответ 3
Да, есть разница.
В первом случае вы делаете необязательный приведение к типу String
. Это вернет значение, если объект, который вы пытаетесь выполнить, действительно равен String
или нолю, если это не так.
Во втором случае вы выполняете принудительное приведение типа String?
. Если значение, которое вы выполняете, не является строкой, это приведет к сбою вашей программы.
Ответ 4
ДА, существует различие.
variable as String?
downcast для необязательного String.If variable
не String?
, это вызовет исключение во время выполнения.
while variable as? String
вернет nil
, если ваш variable
не имеет тип String
или возвращает downcast variable
в String. Это условное понижение, если вы не уверены в том, что вы должны использовать это.