Core data issue Swift

半城伤御伤魂 提交于 2019-12-12 02:37:51

问题


Hello I am currently following a Swift tutorial which uses the old version of Swift and I am not able to follow this as I believe the syntax has changed in the newer version of Swift.

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    var appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

    var context:NSManagedObjectContext = appDel.managedObjectContext

    var newUser = NSEntityDescription.insertNewObjectForEntityForName("users", inManagedObjectContext: context) as NSManagedObject

    newUser.setValue("Joe", forKey: "username")

    newUser.setValue("pass", forKey: "password")

    do {
     try context.save()
    } catch let error {
        print("Couldn't save user data")
        print(error)
    }

    let request = NSFetchRequest(entityName: "Users")
        request.returnsObjectsAsFaults = false
      //  var results = context.executeFetchRequest(request)

    do {
        var results =
            try context.executeFetchRequest(request)
        results = results as! [NSManagedObject]
    } catch let error as NSError {
        print(error)
    }

    for result: AnyObject in results {
        print(results)
    }
}

The error I am receiving is to do with the results on the line for result: AnyObject in results and the error is unresolved identifier 'results' which is giving me the impression that this should be declared somewhere as a variable as it is currently unresolved but I cannot figure out how to fix this, any help would be greatly appreciated, thanks!


回答1:


do {
    var results = try context.executeFetchRequest(request)
    results = results as! [NSManagedObject]
} catch let error as NSError {
    print(error)
}

for result: AnyObject in results {
    print(results)
}

results only has scope inside the do block there. You need to move the processing of the array inside the do:

do {
    var results = try context.executeFetchRequest(request)
    results = results as! [NSManagedObject]
    for result in results {
        print(results)
    }
} catch let error as NSError {
    print(error)
}

Also there's no need to lose information by casting as AnyObject.




回答2:


With the new API's against CoreData (in Swift 3.0) you should do:

let request = NSFetchRequest<Users>(entityName: "Users")
request.returnsObjectsAsFaults = false

do {
    var results =
        try context.fetch(request)
    // `results` will here be [Users]
} catch let error as NSError {
    print(error)
}

The new signature of fetch is fetch<T : NSFetchRequestResult>(_ request: NSFetchRequest<T>) throws -> [T] where T is the same as provided in <HERE> (ex. NSFetchRequest<Users>)



来源:https://stackoverflow.com/questions/39592609/core-data-issue-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!