gpt4 book ai didi

swift - 使用泛型和闭包初始化类实例时出现编译错误

转载 作者:行者123 更新时间:2023-11-30 10:23:11 25 4
gpt4 key购买 nike

我想做的就是将闭包注入(inject)到类初始值设定项中,以便我可以从外部控制其初始化

我定义了一个协议(protocol),该协议(protocol)必须由我想要初始化的类实现:

protocol EntityInitializable {
typealias T : EntityInitializable
init(initializer: (T) -> ())
}

以及一个尝试注入(inject)闭包的函数

class EntityMapper<T : EntityInitializable> {
func f() -> T {
var cb = {(entity: T) -> () in
}

return T(cb)
}
}

这会在编译期间生成以下错误:

error: cannot convert the expression's type 'T.T' to type 'T' return T(cb)

如果我修改上面的代码删除泛型部分,例如:

class MyClass {
init(initializer: (MyClass) -> ()) {
}
}

class EntityMapper {
func f() -> MyClass {
var cb = {(entity: MyClass) -> () in
}

return MyClass(cb)
}
}

它有效。

知道出了什么问题吗?是否可能是因为我试图通过创建泛型实例并传递具有相同泛型类型参数的闭包来递归使用泛型?

最佳答案

您的代码不起作用的原因是没有任何内容显示 TEntityInitialized(为了清楚起见,我从这里开始将其称为 EntityType )必须等于实现该协议(protocol)的类型。这是一个应该可以阐明这个问题的示例:

class A: EntityInitializable {
typealias EntityType = B
init(initializer: (EntityType) -> ()) {

}
}

class B: EntityInitializable {
// [...]
}

根据您编写的代码,这完全没问题,这就是编译器不接受 cb 闭包的原因。其 entity 参数的类型为 T,而 EntityInitialized 期望其类型为 T.EntityType

编写此代码的正确方法是使用 Self 来表示实现协议(protocol)的类:

protocol EntityInitializable {
init(initializer: (Self) -> ())
}

关于swift - 使用泛型和闭包初始化类实例时出现编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24735220/

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