Я столкнулся с очень странным поведением, и я действительно не могу сделать головы или хвосты. Я пытаюсь сохранить типы классов в массиве и хочу позвонить позже, но он не работает. Вот мой кодБыстрое downcasting не работает
class BaseClass {
class func getDetails() -> String {
return "aaaaaa"
}
}
class Foo: BaseClass {
override class func getDetails() ->String {
return "foo"
}
}
class Bar: BaseClass {
override class func getDetails() ->String {
return "bar"
}
}
var arr = [Foo.self, Bar.self]
func test1() {
var x = Foo.self
println(x.getDetails()) //prints foo
if let y = arr[0] as? Foo.Type {
println(y.getDetails()) //doesn't execute
}
if let z = arr[0] as? BaseClass.Type {
println(z.getDetails()) //doesn't execute
}
if let t = arr[0] as? BaseClass {
println(t.dynamicType.getDetails()) //doesn't execute
}
// lets crash
var w = arr[0] as! Foo
//Could not cast value of type 'Test.Foo' (0x1085f17f0) to 'Test.Foo' (0x1085f1830).
}
Я особенно озадачило
Не удалось отбрасываемой значение типа 'Test.Foo' (0x1085f17f0) к 'Test.Foo' (0x1085f1830)
ошибка. Как я могу ссылаться на классы в массиве путем downcasting до BaseClass
, чтобы я мог использовать его функцию getDetails
Странная ваша реализация, я не знаю, как объяснить. Существует много проблем, например: вы объявляете getDetails как функцию класса, но, похоже, вы хотите вызвать функцию экземпляра. должен быть var 'w = arr [0] as! Foo.Type' быть законным –
@HoaParis Там нет ничего незаконного, прочитайте его снова. – Sulthan
@Sulthan: alinoz просто дал ответ, что я хочу сказать. –