【发布时间】:2018-09-05 23:04:46
【问题描述】:
我正在处理 Swift 中的泛型问题。我已经扩展了NSManagedObject 类,并希望创建仅可用于实现我定义的某些协议的类的初始化程序。现在我有类似下面的东西,但这不起作用,甚至无法编译。你能帮我让它工作吗?
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’”。
【问题讨论】:
-
由于您没有使任何东西采用 Nameable,因此您甚至不清楚您要在这里做什么。似乎没有目的。 - 另外,如何解决这个泛型? - 此外,Self 有一个含义,因此您不应将其误用作占位符名称。
-
我还有其他
NSManagedObject子类,并尝试让它们能够调用let obj = MyClass(context: context),但前提是它们实现了Nameable。我看到这是错误的声明,应该更像这样:extension NSManagedObject where NSManagedObject: Nameable但它也不能这样工作。 -
但是你不能根据实例是什么类来阻止实例调用
let obj = MyClass(context:context)!这在任何语言中都毫无意义。如果有一个初始化器MyClass(context:context),任何人都可以调用它(如果他们能看到它)。这就是面向对象编程的本质,如果你明白我的意思的话。我也看不出你有什么理由想要这样做。 -
如果您只想将一个方法注入到采用某种协议的类中,那么您需要的是协议扩展(在 Swift 2.0 中)。