类型安全 swift NSEntityDescriptor insertNewObjectForEntityForName(_:inManagedObjectContext:)
Type-safe swift NSEntityDescriptor insertNewObjectForEntityForName(_:inManagedObjectContext:)
NSEntityDescriptor
的insertNewObjectForEntityForName(_:inManagedObjectContext:)
returnsAnyObject
。如果我将我的实体命名为它们的 NSManagedObject
子类,是否有任何方法可以在 NSManagedObject
上创建一个通用扩展方法,使 returns 成为正确的类型,这样消费者就不需要向下转型了?
public extension NSManagedObject {
public class func entityName() -> String {
let moduledName = self.description()
if let firstDotRange = moduledName.rangeOfString(".") {
return moduledName.substringFromIndex(firstDotRange.endIndex)
} else {
return moduledName
}
}
public class func insert(#managedObjectContext: NSManagedObjectContext) -> Self {
return _insert(managedObjectContext: managedObjectContext)
}
private class func _insert<SelfType>(#managedObjectContext: NSManagedObjectContext) -> SelfType {
return NSEntityDescription.insertNewObjectForEntityForName(entityName(),
inManagedObjectContext: managedObjectContext) as SelfType
}
}
理想情况下,我们可以这样写 insert(managedObjectContext:)
:
public class func insert(#managedObjectContext: NSManagedObjectContext) -> Self {
return NSEntityDescription.insertNewObjectForEntityForName(entityName(),
inManagedObjectContext: managedObjectContext) as Self
}
但这失败了:
'Self' is only available in a protocol or as the result of a class method; did you mean 'NSManagedObject'?
inManagedObjectContext: managedObjectContext) as Self
^~~~
NSManagedObject
因此,我们只是将其保留为原始 insert(managedObjectContext:)
方法的结果,让 swift 的泛型类型推断使 SelfType
成为合适的类型。
NSEntityDescriptor
的insertNewObjectForEntityForName(_:inManagedObjectContext:)
returnsAnyObject
。如果我将我的实体命名为它们的 NSManagedObject
子类,是否有任何方法可以在 NSManagedObject
上创建一个通用扩展方法,使 returns 成为正确的类型,这样消费者就不需要向下转型了?
public extension NSManagedObject {
public class func entityName() -> String {
let moduledName = self.description()
if let firstDotRange = moduledName.rangeOfString(".") {
return moduledName.substringFromIndex(firstDotRange.endIndex)
} else {
return moduledName
}
}
public class func insert(#managedObjectContext: NSManagedObjectContext) -> Self {
return _insert(managedObjectContext: managedObjectContext)
}
private class func _insert<SelfType>(#managedObjectContext: NSManagedObjectContext) -> SelfType {
return NSEntityDescription.insertNewObjectForEntityForName(entityName(),
inManagedObjectContext: managedObjectContext) as SelfType
}
}
理想情况下,我们可以这样写 insert(managedObjectContext:)
:
public class func insert(#managedObjectContext: NSManagedObjectContext) -> Self {
return NSEntityDescription.insertNewObjectForEntityForName(entityName(),
inManagedObjectContext: managedObjectContext) as Self
}
但这失败了:
'Self' is only available in a protocol or as the result of a class method; did you mean 'NSManagedObject'?
inManagedObjectContext: managedObjectContext) as Self
^~~~
NSManagedObject
因此,我们只是将其保留为原始 insert(managedObjectContext:)
方法的结果,让 swift 的泛型类型推断使 SelfType
成为合适的类型。