Swift   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在NSManagedObject Swift扩展中创建托管对象子类的实例?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

当创建NsmanagedObject的扩展帮助程序来创建一个新的托管对象子类时,swift提供了自我类型来模拟这个很棒的instanCEType,但是我似乎不能从AnyObject打字.以下代码不会编译错误’AnyObject’不能转换为’Self’ 帮帮我? extension NsmanagedObject { class func createInContext(context:NS
当创建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
    }
}

大佬总结

以上是大佬教程为你收集整理的如何在NSManagedObject Swift扩展中创建托管对象子类的实例?全部内容,希望文章能够帮你解决如何在NSManagedObject Swift扩展中创建托管对象子类的实例?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。