Почему в Swift я не могу ввести приведение к сохраненному типу?

#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