gpt4 book ai didi

swift - 如何在 Swift 中创建通用的便利初始化器?

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

我正在处理 Swift 中的泛型。我对 NSManagedObject 类进行了扩展,并希望创建仅适用于实现我定义的某些协议(protocol)的类的初始化程序。现在我得到了类似下面的东西,但这不起作用,甚至无法编译。你能帮我让它工作吗?

public extension NSManagedObject {
public convenience init<Self: Nameable>(context: NSManagedObjectContext) {
let entity = NSEntityDescription.entityForName(Self.entityName(), inManagedObjectContext: context)!
self.init(entity: entity, insertIntoManagedObjectContext: context)
}
}

public protocol Nameable {
static func entityName() -> String
}

Xcode 说:“函数签名中未使用通用参数‘Self’”。

最佳答案

正如马特已经解释过的,你不能定义一个初始化器仅限于实现协议(protocol)的类型。或者,你可以改为定义一个全局函数:

public protocol Nameable {
static func entityName() -> String
}

func createInstance<T : NSManagedObject>(type : T.Type, context : NSManagedObjectContext) -> T where T: Nameable {
let entity = NSEntityDescription.entity(forEntityName: T.entityName(), in: context)!
return T(entity: entity, insertInto: context)
}

然后用作

let obj = createInstance(Entity.self, context)

如果您定义方法,您可以避免额外的类型参数作为

func createInstance<T : NSManagedObject>(context : NSManagedObjectContext) -> T where T: Nameable { ... }

并将其用作

let obj : Entity = createInstance(context)

let obj = createInstance(context) as Entity

现在从上下文中推断出类型。

关于swift - 如何在 Swift 中创建通用的便利初始化器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30897892/

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