E. Rivera
E. Rivera

Reputation: 10938

Write custom accessor methods in Swift

I would like to override a Core Data dynamically generated accessor method as can be done in Objective-C.

For instance when a Team's name is nil return its first Player's name instead.

Something like:

class Team: NSManagedObject {

    @NSManaged var name: String { // Error: @NSManaged not allowed on computed properties
        get
        {
            self.willAccessValueForKey("name")
            var teamName = self.primitiveValueForKey("name")
            self.didAccessValueForKey("name")

            return teamName ?? (self.players.firstObject as! Player).name
        }
    }
    @NSManaged var breakPoints: NSOrderedSet
    @NSManaged var gamesWon: NSOrderedSet
    @NSManaged var matches: NSOrderedSet
    @NSManaged var matchesWon: NSOrderedSet
    @NSManaged var players: NSOrderedSet
    @NSManaged var pointsWon: NSOrderedSet
    @NSManaged var setsWon: NSOrderedSet
}

While keeping the stored values untouched and transparently change the value read by objects accessing the Team's name already.

Upvotes: 3

Views: 1826

Answers (1)

Mundi
Mundi

Reputation: 80265

You do not override Core Data accessors in Swift. Instead, create separate computed properties.

@NSManaged var actualName: String
var name: String {
 get { 
   self.willAccessValueForKey("actualName")
   let teamName = self.primitiveValueForKey("actualName")
   self.didAccessValueForKey("actualName")

   return teamName ?? (self.players.first as! Player).name
 }
 set {
   name = newValue
   // omitting KVC markers here
   actualName = newValue
 }
}

Upvotes: 5

Related Questions