Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS - EncodeWithCoder - Encode Nil

I have an object that has a property that might be nil. How should I implement this in encodeWithCoder (and decodeWithCoder)?

- (void)encodeWithCoder:(NSCoder *)aCoder
{ 
    [aCoder encodeObject:_duration forKey:kDuration]; //_duration could be nil
}
like image 293
rizzes Avatar asked May 18 '14 02:05

rizzes


2 Answers

Aaron's solution is clean and clearly communicates what's going on. I couldn't find any information, however, whether it's OK to pass nil to encodeObject:forKey:, so I tested it. It turns out that you can safely do so (please correct me if I'm missing something).

So you can simply say

- (void)encodeWithCoder:(NSCoder *)aCoder
{ 
    [aCoder encodeObject:_duration forKey:kDuration]; //_duration could be nil
}

Even when _duration is nil, this will work. It will simply not write the key to the coder in that case.

like image 134
Johannes Fahrenkrug Avatar answered Oct 14 '22 15:10

Johannes Fahrenkrug


- (void)encodeWithCoder:(NSCoder *)aCoder
{ 
    if (_duration) {
        [aCoder encodeObject:_duration forKey:kDuration]; //_duration could be nil
    }
}

(Your object will be nil on decode if the key is not present.)

like image 32
Aaron Brager Avatar answered Oct 14 '22 16:10

Aaron Brager