2015-04-16 2 views
-1

Swift многое изменил с помощью Xcode 6.3. Мне пришлось заменить десятки мест в каждом из моих приложений. as ->as!. Почему, какие сейчас правила?as! vs как оператор в Xcode 6.3 в Swift

+4

Документально в примечаниях к выпуску Xcode 6.3 и в Swift блоге: https://developer.apple.com/swift/blog /? ID = 23. –

+0

... также в онлайн-документации: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html # // apple_ref/doc/uid/TP40014097-CH22-ID338 или в предыдущих SO-вопросах: http://stackoverflow.com/questions/29637974/ скор-типажи-в-1-2. –

ответ

5

До Swift 1.2, оператор as может быть использован для выполнения двух различных видов конверсии, в зависимости от типа выражения преобразуется и тип он преобразуется в:

  • Гарантированное преобразование значения одного типа другому, успех которого может быть проверен компилятором Swift. Например, повышение (например, преобразование из класса в один из его суперклассов) или указание типа литерального выражения (например, 1 как Float).

  • Принудительное преобразование одного значения другому, безопасность которого не может быть гарантирована компилятором Swift и может вызвать ловушку времени выполнения. Например, downcasting, преобразование из класса в один из его подклассов.

Swift 1.2 разделяет понятия гарантированного преобразования и принудительного преобразования на два разных оператора. Гарантированное преобразование все еще выполняется с оператором as, но принудительное преобразование теперь использует оператор as!. Значение ! означает, что преобразование может завершиться неудачей. Таким образом, вы сразу знаете, какие преобразования могут привести к сбою программы.

Источник: https://developer.apple.com/swift/blog/?id=23

0

Согласно release notes:

Понятия гарантированного преобразования и «принудительный failable» преобразование теперь разделены на два оператора. Принудительное отказоустойчивое преобразование теперь использует как! оператор. ! дает понять читателям кода, что может произойти сбой и привести к ошибке выполнения. Оператор «as» остается для upcasts (например, «someDerivedValue as Base») и введите аннотации («0 как Int8»), которые гарантированно не сработают.

1

Практическое отличие заключается в следующем:

var optionalString = dict.objectForKey("SomeKey") as? String 

optionalString будет переменная типа String?. Если базовый тип - это нечто иное, чем String, это безвредно назначает nil необязательному.

var optionalString = dict.objectForKey("SomeKey") as! String? 

Это говорит, я знаю, эта вещь String?. Это также приведет к тому, что optionalString будет иметь тип String?, но он сработает, если базовый тип - это что-то еще.

Первый стиль затем используется с if let безопасно разворачивать опциональный:

if let string = dict.objectForKey("SomeKey") as? String { 
    // If I get here, I know that "SomeKey" is a valid key in the dictionary, I correctly 
    // identified the type as String, and the value is now unwrapped and ready to use. In 
    // this case "string" has the type "String". 
    println(string) 
} 
+0

Пожалуйста, не копируйте ответы других. Если вы считаете, что он отвечает на вопрос, разместите ссылку в комментарии. http://stackoverflow.com/a/25710162/1630618 – vacawama

Смежные вопросы