Swift: разница как String? как? строка

Есть ли разница между as? String и as String? в Swift? Если да, то какая разница и когда я должен использовать один против другого?

Ответы

Ответ 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 теперь является особым типом приведения, используемым при литье в эквивалентные типы, обычно с мостиковыми типами, такими как Swift String и 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.

  1. String? An optional 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. Это условное понижение, если вы не уверены в том, что вы должны использовать это.