How to use generic types to get object with same type

前端 未结 3 1754
南笙
南笙 2020-12-06 13:24

I have extension for NSManagedObject that should help me to transfer objects between contexts:

extension NSManagedObject {

    func transferTo(         


        
3条回答
  •  情话喂你
    2020-12-06 13:47

    Update: For a better solution, see Rob's answer.


    Similarly as in How can I create instances of managed object subclasses in a NSManagedObject Swift extension?, this can be done with a generic helper method:

    extension NSManagedObject {
    
        func transferTo(context context: NSManagedObjectContext) -> Self {
            return transferToHelper(context: context)
        }
    
        private func transferToHelper(context context: NSManagedObjectContext) -> T {
            return context.objectWithID(objectID) as! T
        }
    }
    

    Note that I have changed the return type to Self. objectWithID() does not return an optional (in contrast to objectRegisteredForID(), so there is no need to return an optional here.

    Update: Jean-Philippe Pellet's suggested to define a global reusable function instead of the helper method to cast the return value to the appropriate type.

    I would suggest to define two (overloaded) versions, to make this work with both optional and non-optional objects (without an unwanted automatic wrapping into an optional):

    func objcast(obj: AnyObject) -> T {
        return obj as! T
    }
    
    func objcast(obj: AnyObject?) -> T? {
        return obj as! T?
    }
    
    extension NSManagedObject {
    
        func transferTo(context context: NSManagedObjectContext) -> Self {
            let result = context.objectWithID(objectID) // NSManagedObject
            return objcast(result) // Self
        }
    
        func transferUsingRegisteredID(context context: NSManagedObjectContext) -> Self? {
            let result = context.objectRegisteredForID(objectID) // NSManagedObject?
            return objcast(result) // Self?
        }
    }
    

    (I have updated the code for Swift 2/Xcode 7. The code for earlier Swift versions can be found in the edit history.)

提交回复
热议问题