如何在NSManagedObject Swift扩展中创建托管对象子类的实例?

当创建NSManagedobject的扩展帮助程序来创建一个新的托管对象子类时,swift提供了自我类型来模拟这个很棒的instancetype,但是我似乎不能从AnyObject打字.以下代码不会编译错误’AnyObject’不能转换为’Self’

帮帮我?

extension NSManagedobject
{
    class func createInContext(context:NSManagedobjectContext) -> Self {
        var classname = className()
        var object: AnyObject = NSEntityDescription.insertNewObjectForEntityForName(classname,inManagedobjectContext: context)
        return object
    }


    class func className() -> String {
        let classstring = NsstringFromClass(self)
        //Remove Swift module name
        let range = classstring.rangeOfString(".",options: NsstringCompareOptions.CaseInsensitiveSearch,range: Range<String.Index>(start:classstring.startIndex,end: classstring.endindex),locale: nil)
        return classstring.substringFromIndex(range!.endindex)
    }

}
诀窍是使用一个通用的助手方法来推断自己的类型
从上下文.您的className()方法也可以稍微简化,并且可以通过entityName()更好的名称
extension NSManagedobject
{
    class func createInContext(context:NSManagedobjectContext) -> Self {
        return createInContextHelper(context)
    }

    private class func createInContextHelper<T>(context:NSManagedobjectContext) -> T {
        let classname = entityName()
        let object = NSEntityDescription.insertNewObjectForEntityForName(classname,inManagedobjectContext: context) as! T
        return object
    }

    class func entityName() -> String {
        let classstring = NsstringFromClass(self)
        // The entity is the last component of dot-separated class name:
        let components = split(classstring,{ $0 == "." })
        return components.last ?? classstring
    }
}

然后

let obj = YourEntity.createInContext(context)

作品和编译器将obj的类型正确地声明为YourEntity.

更新:使用How to use generic types to get object with same type中的想法,也可以使用全局可重用的函数而不是帮助程序来将返回值转换为适当的类型:

func objcast<T>(obj: AnyObject) -> T {
    return obj as T
}

extension NSManagedobject
{
    class func createInContext(context:NSManagedobjectContext) -> Self {
        let classname = entityName()
        let object: AnyObject = NSEntityDescription.insertNewObjectForEntityForName(classname,inManagedobjectContext: context)
        return objcast(object)
    }

    class func entityName() -> String {
        let classstring = NsstringFromClass(self)
        // The entity is the last component of dot-separated class name:
        let components = split(classstring,{ $0 == "." })
        return components.last ?? classstring
    }
}

Swift 1.2 / Xcode 6.3和Swift 2 / Xcode 7的更新:

func objcast<T>(obj: AnyObject) -> T {
    return obj as! T
}

extension NSManagedobject
{
    class func createInContext(context:NSManagedobjectContext) -> Self {
        let classname = entityName()
        let object: AnyObject = NSEntityDescription.insertNewObjectForEntityForName(classname,inManagedobjectContext: context)
        return objcast(object)
    }

    class func entityName() -> String {
        let classstring = NsstringFromClass(self)
        // The entity is the last component of dot-separated class name:
        let components = classstring.componentsSeparatedByString(".")
        return components.last ?? classstring
    }
}

或者使用unsafeBitCast而不是帮助方法,如注释中所建议的:

extension NSManagedobject
{
    class func createInContext(context:NSManagedobjectContext) -> Self {
        let classname = entityName()
        let object: AnyObject = NSEntityDescription.insertNewObjectForEntityForName(classname,inManagedobjectContext: context)
        return unsafeBitCast(object,self)
    }

    class func entityName() -> String {
        let classstring = NsstringFromClass(self)
        // The entity is the last component of dot-separated class name:
        let components = classstring.componentsSeparatedByString(".")
        return components.last ?? classstring
    }
}

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...