Подтвердить что ты не робот

Приведение в тип метатипа в Swift?

Можете ли вы применить тип Metatype в Swift? Кажется, вы должны уметь (ведь вы можете создавать объекты из метатипов).

Не работает следующее:

class Super {}

class A : Super {}

let superA:Super = A()
let subType = superA.dynamicType
let afterCast = superA as subType 

//Compiler error: "use of undeclared type 'subType'"

Кто-нибудь знает правильный способ сделать это?

Edit:

Как отмечалось в newacct, результат .dynamicType, очевидно, неизвестен до выполнения, поэтому время выполнения компиляции в результате .dynamicType не имеет смысла.

Итак, ответ таков: "Вы не можете" (и нет никаких оснований для попытки).

4b9b3361

Ответ 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

Не ясно, что именно вы хотите.