Ответ 1
Прежде всего, as
принимает тип, а не выражение, в правой части. Итак, у вас есть синтаксическая ошибка.
То, что вы пытаетесь сделать, - это "приведение" к типу, который вычисляется во время выполнения. Что бы это значило? Сначала рассмотрим, что такое "литье".
Обычно, когда у нас есть выражение cast x as T
, оно имеет две компоненты:
- В момент компиляции: все выражение
x as T
имеет тип времени компиляцииT?
, который позволяет вам делать вещи с полученным выражением, которое вы, возможно, не можете сделать непосредственно наx
. Другими словами, он позволяет вам изменять тип времени компиляции. - Во время выполнения: он проверяет, является ли тип времени выполнения
x
подтипомT
, и если он есть, он вычисляет необязательное значение, содержащее это значение, в противном случае он оценивается какnil
.
Если тип T
не известен во время компиляции, то, очевидно, вы не можете выполнить часть времени компиляции. (Тип времени компиляции результирующего выражения не может, очевидно, зависеть от того, что неизвестно во время компиляции.)
Другая часть, компонент времени выполнения, может быть выполнена с типом, вычисленным во время выполнения? Конечно. Например,
import Foundation
let afterCast : Super? =
(superA as AnyObject).isKindOfClass(subType) ? superA : nil
Не ясно, что именно вы хотите.