10

I am trying to use the countForFetchRequest method on a managed object context in Swift 2.0.

I note that the error handling for executeFetchRequest has been changed across to the new do-try-catch syntax:

func executeFetchRequest(_ request: NSFetchRequest) throws -> [AnyObject]

but the countForFetchRequest method still uses the legacy error pointer:

func countForFetchRequest(_ request: NSFetchRequest,
                    error error: NSErrorPointer) -> Int

...and I am having a bit of trouble figuring out how to use this in Swift 2.0.

If I do the same thing as pre-Swift 2.0:

let error: NSError? = nil
let count = managedObjectContext.countForFetchRequest(fetchRequest, error: &error)

I get errors saying to remove the &, but if I remove that I get another error saying that NSError cannot be converted to an NSErrorPointer.

Any help would be appreciated about how to get this working.

Skoota
  • 5,280
  • 9
  • 52
  • 75

2 Answers2

29

Your code is almost correct, but error needs to be a variable, in order to be passed as inout-argument with &:

var error: NSError? = nil
let count = managedObjectContext.countForFetchRequest(fetchRequest, error: &error)

Update: As of Swift 3, countForFetchRequest throws an error:

do {
    let count = try managedObjectContext.context.count(for:fetchRequest)
    return count
} catch let error as NSError {
    print("Error: \(error.localizedDescription)")
    return 0
}
Durul Dalkanat
  • 7,266
  • 4
  • 35
  • 36
Martin R
  • 529,903
  • 94
  • 1,240
  • 1,382
0

You need to do like this:

let error = NSErrorPointer()
let fetchResults = coreDataStack.context.countForFetchRequest(fetchRequest, error: error)
print("Count \(fetchResults)")

This is the code for Swift 2.0

Sohil R. Memon
  • 9,404
  • 1
  • 31
  • 57