Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Core data ManagedObjectModel子类没有';我不能在斯威夫特工作_Core Data_Swift_Nsmanagedobject_Nsmanagedobjectmodel - Fatal编程技术网

Core data ManagedObjectModel子类没有';我不能在斯威夫特工作

Core data ManagedObjectModel子类没有';我不能在斯威夫特工作,core-data,swift,nsmanagedobject,nsmanagedobjectmodel,Core Data,Swift,Nsmanagedobject,Nsmanagedobjectmodel,总结一下我所做的工作: 创建了一个名为2048的项目 创建了NSManagedObject的子类 class BestScore: NSManagedObject { @NSManaged var bestScoreModel: BestScoreModel func update(score: Int) { self.bestScoreModel!.score = score } } 创建了NSManagedObjectModel的子类 class

总结一下我所做的工作:

  • 创建了一个名为2048的项目

  • 创建了NSManagedObject的子类

    class BestScore: NSManagedObject {
        @NSManaged var bestScoreModel: BestScoreModel
        func update(score: Int) {
            self.bestScoreModel!.score = score
        }
    }
    
  • 创建了NSManagedObjectModel的子类

    class BestScoreModel: NSManagedObjectModel {
        @NSManaged var score: Int
    }
    
  • 在“核心数据”选项卡下创建了数据模型。将文件命名为2048.xcdatamodeld。添加了一个具有一个属性“score”的实体BestScoreModel,并将类型定义为整数16。此外,我还根据更新了实体的类2048.BestScoreModel

  • 在控制器类中,我添加了以下变量

    class HomeViewController: UIViewController {
    
        var bestScore: BestScore?
    
        @lazy var context: NSManagedObjectContext = {
            let serviceName = NSBundle.mainBundle().infoDictionary.objectForKey("CFBundleName") as String
            let modelURL = NSBundle.mainBundle().URLForResource(serviceName, withExtension: "momd")
            let model = NSManagedObjectModel(contentsOfURL: modelURL)
            if model == nil {
                println("Error initilizing model from : \(modelURL)")
                abort()
            }
            let coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
            let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
            let storeURL = (urls[urls.endIndex-1]).URLByAppendingPathComponent("\(serviceName).sqlite")
            var error: NSError? = nil
            var store = coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error)
            if store == nil {
                println("Failed to load store at \(storeURL) with error: \(error?.localizedDescription)")
                abort()
            }
            var context = NSManagedObjectContext()
            context.persistentStoreCoordinator = coordinator
            return context
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            let entity: NSEntityDescription = NSEntityDescription.entityForName("BestScoreModel", inManagedObjectContext: context)
            bestScore = BestScore(entity: entity, insertIntoManagedObjectContext: context)
            bestScore.update(0)
        }
    }
    
  • 该应用程序已成功构建,但当我运行模拟器时,它抛出了以下异常

        2014-07-13 00:56:59.944 2048[76600:4447122] -[NSManagedObject update:]: unrecognized selector sent to instance 0x10bc55d20
        2014-07-13 00:56:59.948 2048[76600:4447122] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSManagedObject update:]: unrecognized selector sent to instance 0x10bc55d20'
    
    我对iOS开发完全是新手,以前没有任何经验。我想利用Swift作为一个机会,在不学习objective-c的情况下开始编写应用程序。如果我有什么配置错误,请告诉我

    谢谢你的帮助


    PS:我从中获得托管对象上下文的实现。非常感谢作者

    NSManagedObjectModel描述了应用程序中使用的所有实体的集合,通常没有理由对其进行子类化

    我建议您对实体和对应实体使用相同的名称 托管对象子类。(这也是Xcode在创建Objective-C托管对象子类时所做的)

    Swift托管对象子类(Xcode还不能自动创建) 看起来就像这样:

    class BestScore: NSManagedObject {
        @NSManaged var score: NSNumber
    }
    
    我使用了
    NSNumber
    类型而不是
    Int16
    ,因为Swift中的标量访问器方法 对象子类尚未正常工作,请进行比较

    然后将使用创建一个新的BestScore对象

    bestScore = NSEntityDescription.insertNewObjectForEntityForName("BestScore", inManagedObjectContext: context) as BestScore
    
    您可以直接访问其属性,而无需使用
    update()
    函数:

    bestScore!.score = 0
    
    附加说明:将
    bestScore
    属性定义为 隐式展开可选,因为您希望它在
    viewDidLoad:
    。这将在以后为您节省许多显式展开:

    var bestScore: BestScore!
    
    此外,如果应用程序再次运行,则可能需要重新加载 现有最佳分数,而不是创建新对象。 这意味着您必须首先执行一个获取请求,然后插入一个新的 对象(仅当未找到时):

    let request = NSFetchRequest(entityName: "BestScore")
    var error : NSError?
    let result = context.executeFetchRequest(request, error: &error)
    
    if !result || result.count == 0 {
        // Error or no object found: create new one:
        bestScore = NSEntityDescription.insertNewObjectForEntityForName("BestScore", inManagedObjectContext: context) as BestScore
        bestScore.score = 0
    } else {
        // Use existing object:
        bestScore = result[0] as BestScore
    }
    let score = bestScore.score.integerValue // NSNumber --> Integer
    

    尝试为
    .xcdatamodeld
    文件中的实体指定模块名称。有关详细说明,请参见本书的“实现核心数据管理对象子类”部分。

    很抱歉响应太晚。我尝试了你的建议,现在我能够实例化托管对象上下文。但调用NSEntityDescription.insertNewObjectForEntityForName()时仍会出现异常。线程异常是:
    thread#1:tid=0x3b9e05,0x00000001001e4dfa libswift_stdlib_core.dylib swift_dynamiccastcastcastcastcastcastcastcastcastcastcastcastcastcastcastcastcast+106,queue='com.apple.main thread',-stop-reason=EXC_断点(code=EXC_I386_BPT,subcode=0x0)
    @Bing:我想我在发布代码之前已经测试过了,它运行正常。您是否在核心数据模型检查器中将实体的“实体”和“类”都设置为“BestScore”?如果您指的是2048.xcdatamodeld文件,则是的,我已将实体重命名为BestScore,将类重命名为2048.BestScore。我还试着把这门课评为最佳成绩。两个案例都引发了相同的异常:(我肯定遗漏了一些东西,我觉得用swift进行调试非常困难,我不确定Objective-C,但我使用了我原来的方式(分别创建NSEntityDescription和BestScore)它成功了!但现在我在尝试调用更新方法时遇到了另一个异常。按照您的建议直接更改分数值确实有效,但我仍然希望更新方法能够工作,因为这主要是为了学习。我遇到的异常是
    因未捕获的异常“NSInvalidArgumentEx”而终止应用程序异常“,原因:”-[NSManagedObject updateBestScore:withBestLevel:::无法识别的选择器已发送到实例0x10bf39e50'
    非常感谢您的帮助!