作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在处理 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/
我的图书馆的几个部分都带有“便利”功能。例如,容器类可能具有解析字符串信息的功能。这些功能不一定一直都需要(或想要),因此我想将它们放在单独的文件中,以便可以根据用户的需要将它们包括或省略。 应该如何
我已经尝试在 Stack Overflow 和其他网站上搜索使用 Sets 与 Lists 的优缺点和便利,但我真的找不到明确的答案何时使用这个或那个。 从 Hibernate 的文档中,他们声明非重
我是一名优秀的程序员,十分优秀!