gpt4 book ai didi

ios - 返回一个 Self 类型的数组

转载 作者:搜寻专家 更新时间:2023-10-31 21:48:16 25 4
gpt4 key购买 nike

我无法找到一种在运行时在 Swift 中返回特定动态类类型实例数组的方法。

我成功地编译并测试了这个返回类的单个实例的版本:

class Generic {

class func all() -> Self {
return self.init()
}

required init() {

}

}

class A: Generic {

}

let a = A.all() // is of type A

这里的挑战是编译允许 all函数原型(prototype)如下:class func all() -> [Self] (即返回一个实例数组,使用子类,没有任何转换)。

class Generic {

class func all() -> [Self] {
return [self.init()]
}

required init() {

}

}

class A: Generic {

}

let a = A.all() // won't compile

我可以返回 Generic 的数组带有 class func all() -> [Generic] 的实例但这需要使用 as! 进行额外的转换获得正确的类型 A .我想在类 A 的上下文中利用 begin并使用 Self关键字,让编译器推断“真实”类型。大家觉得有可能吗?

好像只能返回单个实例,不能返回数组。

编辑:使用 AnyObject 使其工作.更好,但不是最优的,因为它需要转换为正确的类型。

class Generic {

class func all() -> [AnyObject] {
return [self.init()]
}

required init() {

}

}

class A: Generic {

}

let a = A.all() as! [A]

谢谢!

PS:使用泛型或协议(protocol)/协议(protocol)扩展的任何其他方式也是一种选择。如果您想要一个更“Swifty”的版本,请成为我的客人。忍不住想也许有更好的方法来做到这一点,但无法弄清楚如何做。

最佳答案

我能看到做类似事情的唯一选择是使用协议(protocol)而不是基类,如下所示:

protocol Generic {

func all() -> [Self]

init()

}

extension Generic {

func all() -> [Self] {
return [self.dynamicType.init()]
}

}

final class A : Generic {

}

A().all()

这样做有两个限制。首先,所有符合你的协议(protocol)的类都必须是最终的。其次,显然所有类都必须实现协议(protocol)中定义的init,否则我们将无法定义all 方法。

编辑:只要您不定义任何其他初始化程序,您实际上不需要定义 init

编辑 2:我没有注意到您使用了类函数,您可以修改我的示例以使用类函数而不是实例方法,方法是将 func all() -> [Self] 替换为 static func all() -> [Self]

func all() -> [Self] {
return [self.dynamicType.init()]
}

static func all() -> [Self] {
return [self.init()]
}

关于ios - 返回一个 Self 类型的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32699982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com