#swift #types #casting
#swift #типы #Кастинг
Вопрос:
Я пытаюсь сделать некоторые вещи в Swift, связанные с проверкой типов во время выполнения, которые удаляются из-за сохранения как Any (что, я знаю, звучит некрасиво, но это узкий вариант использования, и у меня есть веские причины). Я столкнулся со странной проблемой, которую можно суммировать с помощью этих примеров:
Это работает в cli / REPL:
let pType: Any.Type = Int.self
if let x = 3 as? pType { print("found an int") }
Однако это не работает:
let pType: Any.Type = Int.self; if let x = 3 as? pType { print("found an int") }
И приводит к ошибке: не удается найти тип ‘pType’ в области видимости
При сборке как программы я получаю одну и ту же ошибку в любой форме.
Кто-нибудь может объяснить, почему это не работает? И если есть какой-либо способ обойти это? И если то, что я делаю, просто неправильно, почему это работает в REPL?
Комментарии:
1. «Это работает под cli / REPL» Ну, это не должно. «И если то, что я делаю, просто неправильно, почему это работает в REPL?» Это просто неправильно, но я не могу объяснить, почему это работает в REPL. В правилах определения области видимости есть что-то очень странное, что вызывает такого рода аномалии. Если вы попробуете это в реальном проекте, вы обнаружите, что он не компилируется, и это правильно. Вы не можете просто определить метатип
let
подобным образом. Это не Ruby или какой-то дурацкий забавный язык вроде этого. 🙂
Ответ №1:
Я думаю, что то, что вы ищете, является каким-то общим. Возможно, так:
func isThisObject<T>(_ object:Any, ofThisType type: T.Type) -> Bool {
return object is T
}
Примеры:
let i : Any = 1
isThisObject(i, ofThisType:Int.self) // true
Или:
let s : Any = "Howdy"
isThisObject(s, ofThisType:Int.self) // false
Или вы можете опустить Any, это не имеет значения.
Или, если для вас действительно важно выполнить приведение прямо там:
func tryToCast<T>(_ object:Any, toThisType type: T.Type) -> T? {
return object as? T
}
tryToCast(1, toThisType: Int.self) // 1
tryToCast("howdy", toThisType: Int.self) // nil