NSManagedObject 上的 Swift 扩展

Posted

技术标签:

【中文标题】NSManagedObject 上的 Swift 扩展【英文标题】:Swift extension on NSManagedObject 【发布时间】:2015-01-07 17:39:31 【问题描述】:

我可以在 Objective-C 中做到这一点,但我无法弄清楚如何让它在 Swift 中工作。我正在为 NSManagedObject 编写一个扩展,以便在我想创建一个新实体的任何时候都可以简单地调用一个函数。然后该函数将检查现有实体是否匹配,如果不匹配,该函数将创建新实体并返回它。如果有匹配,它将返回匹配。这是我的代码:

extension Chapter 
    class func createChapter(i_d: Int, team_level: Int, location: String, name: String, school: String, image: UIImage, context: NSManagedObjectContext) -> Chapter 

        var chapter : Chapter?

        var request : NSFetchRequest = NSFetchRequest(entityName: "Chapter")
        request.predicate = NSPredicate(format: "i_d = \(i_d)")
        var error : NSError?
        var results : [Chapter] = context.executeFetchRequest(request, error: &error) as [Chapter]

        if error != nil
            println(error)
         else if results.count == 1 
            println("Only found one Chapter match for id: \(i_d)")
            chapter = results.first!
         else if results.count > 1 
            println("Found multiple Chapters for id: \(i_d)")
            for chapter in results 
                println(chapter.name)
            
         else 
            chapter = NSEntityDescription.insertNewObjectForEntityForName("Chapter", inManagedObjectContext: context) as? Chapter
            chapter?.i_d = i_d
            chapter?.team_level = team_level
            chapter?.location = location
            chapter?.name = name
            chapter?.school = school
            chapter?.image = UIImagePNGRepresentation(image)

            var error: NSError? = nil
            if !context.save(&error) 
                println("Saving error \(error), \(error?.userInfo)")
             else 
                println("Saved a Chapter with id: \(i_d)")
            
        

        return chapter!
    

“i_d”是实体的唯一 ID

这就是我以前在 Objective-C 中能够调用这样的东西的方式(粗略翻译):

Chapter *chapter = [Chapter createChapterWithID:i_d, team_level:team_level, location:location, name:name, school:school, image:image, context:context];

每当我尝试类似 var chap: Chapter = Chapter.createChapter(...) 时,Xcode 只允许我将另一个 Chapter 对象放入参数列表中,而如果我尝试调用该函数来自一个Chapter实例,函数参数可以很好的填写。

我将如何解决我的问题?

编辑:

根据回答建议,我通过将“类”放在我的函数定义前面,以及在函数中正确创建我的初始变量并在必要的地方添加问号来修复我的代码。

【问题讨论】:

【参考方案1】:

您可以尝试创建一个方便的 init。

http://devmonologue.com/ios/swift/swift-initializers-designated-convenience/

另外注意,如果你想做 Chapter.createChapter(),createChapter 需要是一个类 func,在你的扩展中它只是一个普通的 func。所以它期望一个章节对象来创建对象,而不是类。

改变

func createChapter ...

class func createChapter ...

【讨论】:

好的,在函数之前添加“类”使其现在可以工作。但是,我想我可能在函数定义的开头错误地声明了 Chapter 变量。有什么建议吗? 我建议您再问一个问题并发布相关代码。我不知道你是如何初始化你的章节对象的,所以很难说发生了什么。我也不知道你得到了什么错误。所以提出一个新问题并发布所有相关代码和错误。 没关系。只是玩了一些东西并让它工作。我会把它作为一个编辑放出来

以上是关于NSManagedObject 上的 Swift 扩展的主要内容,如果未能解决你的问题,请参考以下文章

在 Xcode 10.2 上的 Swift4.2 中插入 NSManagedObject 后,我​​会立即收到 Xcode 构建错误

将我的 NSManagedObject 子类与我的 ViewController.swift 连接起来

SWIFT CoreData NSManagedObject

Swift中的NSManagedObject描述

NSManagedObject 不能符合 Swift 中的协议

“filename+CoreDataProperties.swift”和“filename.swift”NSmanagedObject 子类有啥用?