如何在 Swift 中实例化一个 class(存储在数组中)?
How do I instanciate a class (stored in an Array) in Swift?
我想保留几个 类 的数组并根据需要实例化它们。这是一些演示代码:
class AClass {
func areYouThere() -> String {
return "Yes, I am!"
}
}
class FirstClass: AClass {
override func areYouThere() -> String {
return "Yes, I am #1!"
}
}
class SecondClass: AClass {
override func areYouThere() -> String {
return "Yes, I am #2!"
}
}
let className = FirstClass.self
let classReferences: [AClass.Type] = [FirstClass.self, SecondClass.self]
let instanceOfClass = classReferences[0].init()
let test = instanceOfClass.areYouThere()
代码确实可以编译,但是当我 运行 它时,"test" 将保留 "Yes, I am!"(没有 #1),因为 instanceOfClass 是 "AClass" 的一个实例,不是 "FirstClass"。我想,我的数组的类型 [AClass.Type] 是错误的。我也试过 "AnyClass",但编译器抱怨说 "init" 没有在 "AnyClass" 中定义。有什么想法吗?
谢谢!
Ingo.
您的基础 class 中需要 required init()
初始值设定项。
class AClass {
required init() {} // <- HERE
func areYouThere() -> String {
return "Yes, I am!"
}
}
因为子class是may not inherit init()
initializer.
IMO,这是一个编译器错误。编译器应该报告 classReferences[0]
可能没有 init()
.
顺便说一句,你可以:
let instanceOfClass = classReferences[0]()
不用写.init
.
我想保留几个 类 的数组并根据需要实例化它们。这是一些演示代码:
class AClass {
func areYouThere() -> String {
return "Yes, I am!"
}
}
class FirstClass: AClass {
override func areYouThere() -> String {
return "Yes, I am #1!"
}
}
class SecondClass: AClass {
override func areYouThere() -> String {
return "Yes, I am #2!"
}
}
let className = FirstClass.self
let classReferences: [AClass.Type] = [FirstClass.self, SecondClass.self]
let instanceOfClass = classReferences[0].init()
let test = instanceOfClass.areYouThere()
代码确实可以编译,但是当我 运行 它时,"test" 将保留 "Yes, I am!"(没有 #1),因为 instanceOfClass 是 "AClass" 的一个实例,不是 "FirstClass"。我想,我的数组的类型 [AClass.Type] 是错误的。我也试过 "AnyClass",但编译器抱怨说 "init" 没有在 "AnyClass" 中定义。有什么想法吗?
谢谢! Ingo.
您的基础 class 中需要 required init()
初始值设定项。
class AClass {
required init() {} // <- HERE
func areYouThere() -> String {
return "Yes, I am!"
}
}
因为子class是may not inherit init()
initializer.
IMO,这是一个编译器错误。编译器应该报告 classReferences[0]
可能没有 init()
.
顺便说一句,你可以:
let instanceOfClass = classReferences[0]()
不用写.init
.