gpt4 book ai didi

ios - 子类的类上的泛型

转载 作者:行者123 更新时间:2023-11-28 07:16:29 25 4
gpt4 key购买 nike

在我用 Swift 编写的应用程序中,我有以下类结构。 A 类有一个执行某些操作的静态方法,但在非常简单的形式中,它看起来像下面的代码。

class A {
class func create<T: A>() -> T? {
println(NSStringFromClass(T));
return nil;
}
}

B 类是 A 类的子类。

class B : A {
}

现在,当我执行以下代码时,println 命令输出 A 而不是 B

var myVar:B? = B.create();

我不确定我在这里做错了什么,但我希望它输出 B

当在 create 方法中调试和放置断点时,值 $swift.type.T 被定义为 Builtin.RawPointer MyApp.A 而不是 B

最佳答案

A 上的通用类方法对我来说没有意义。相反,我实际上会使用类似下面的代码。通过这种方式,它创建了一个 Self 的实例,这是您调用它的任何类。在这种情况下不需要泛型。

class A {
required init() {}
class func create() -> Self {
return self()
}
func test() -> String {
return "A"
}
}
class B : A {
override func test() -> String {
return "B"
}
}

let b = B.create() // "{A}" according to the playground, but it is a "B" instance!
b.test() // "B"

请注意,A 需要一个必需的初始化程序,因为使用了 Self。在 playground 中执行时,创建的实例在右侧显示为 {A}。我认为这是 Xcode 中的一个错误,实际类型是正确的。

编辑:

我相信上面的代码并不是您要找的东西,现在我确实明白您想要做什么了。我建议不要根据实际的类名来这样做,而是使用通用类为您创建实例:

protocol Entity {
init()
class func entityName() -> String
}
class EntityFactory<T : Entity> {
class func newEntity() -> T? {
var entity: T?
// ... create entity here using T.entityName()
return entity
}
}
class Person : Entity {
required init() {}
class func entityName() -> String {
return "Person"
}
}

let person = EntityFactory<Person>.newEntity()

认为这是一个更优雅的解决方案,它将创建实体的责任转移到一个单独的泛型类中。这会产生可维护和可测试的代码。您甚至可以出于单元测试的目的进一步将其抽象出来,但这似乎超出了此处的范围。

关于ios - 子类的类上的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25742456/

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