swift - 类型安全 swift NSEntityDescriptor insertNewObjectForEntityForName(_ :inManagedObjectContext:)

标签 swift generics core-data

NSEntityDescriptorinsertNewObjectForEntityForName(_:inManagedObjectContext:)返回AnyObject 。如果我将我的实体命名为与它们的 NSManagedObject 相同的名称子类,有没有办法在 NSManagedObject 上创建通用扩展方法返回正确的类型,这样消费者就不需要向下转换?

最佳答案

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(managementObjectContext:),如下所示:

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(managementObjectContext:) 方法的结果,并让 swift 的泛型类型推断使 SelfType 成为适当的类型。

关于swift - 类型安全 swift NSEntityDescriptor insertNewObjectForEntityForName(_ :inManagedObjectContext:),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28869854/

相关文章:

arrays - 使用多维泛型数组时出现多个错误

ios - 约束协议(protocol)的关联类型本身

ios - Swift 4 泛型数组作为泛型类中的参数

objective-c - 如何强制核心数据从模型创建 Sqlite 数据库*之前*任何数据都保存在应用程序中?

ios - 加载指定初始化程序核心数据失败

swift - ContentView 背景色 Swift

json - 未加密的容器 JSON Swift 可解码

swift - split 现在提示缺少 "isSeparator"

utf-8 - Swift 中的 NSJSONSerialization 和非拉丁(西里尔)字符