我无法找出一种在 Swift 中在运行时返回特定动态类类型的实例数组的方法。
我成功编译并测试了这个版本,它返回一个类的单个实例:
class Generic {
class func all() -> Self {
return self.init()
}
required init() {
}
}
class A: Generic {
}
let a = A.all() // is of type A
Run Code Online (Sandbox Code Playgroud)
这里的挑战是进行编译以允许all函数原型如下:(class func all() -> [Self]即返回一个实例数组,使用子类,没有任何 cast)。
class Generic {
class func all() -> [Self] {
return [self.init()]
}
required init() {
}
}
class A: Generic {
}
let a = A.all() // won't compile
Run Code Online (Sandbox Code Playgroud)
我可以Generic使用 with返回一个实例数组,class func all() -> [Generic]但这需要额外的强制as!转换才能获得正确的 type A。我想在类的上下文中利用 beginA并使用Self关键字,让编译器推断“真实”类型。大家觉得可能吗?
似乎只能返回单个实例,而不是数组。
编辑:使用AnyObject. 更好,但不是最佳的,因为它需要转换为正确的类型。
class Generic {
class func all() -> [AnyObject] {
return [self.init()]
}
required init() {
}
}
class A: Generic {
}
let a = A.all() as! [A]
Run Code Online (Sandbox Code Playgroud)
谢谢!
PS:使用泛型或协议/协议扩展执行此操作的任何其他方法也是一种选择。如果你有一个更“Swifty”的版本,请成为我的客人。不禁想到可能有更好的方法来做到这一点,但无法弄清楚如何。
我能看到做类似事情的唯一选择是使用协议而不是基类,如下所示:
protocol Generic {
func all() -> [Self]
init()
}
extension Generic {
func all() -> [Self] {
return [self.dynamicType.init()]
}
}
final class A : Generic {
}
A().all()
Run Code Online (Sandbox Code Playgroud)
这样做有两个限制。首先,所有符合您的协议的类都必须是最终的。其次,所有类显然都必须实现协议中定义的 init,否则我们将无法定义该all方法。
编辑:只要您不定义任何其他初始化程序,您实际上不需要定义 init
编辑2:我没有注意到您使用了类函数,您可以修改我的示例以使用类函数而不是实例方法,方法是替换func all() -> [Self]为static func all() -> [Self]and
func all() -> [Self] {
return [self.dynamicType.init()]
}
Run Code Online (Sandbox Code Playgroud)
和
static func all() -> [Self] {
return [self.init()]
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1269 次 |
| 最近记录: |