instancetype →
From NSHipster, a great site that Objective-C developers should be reading:
With
instancetype, the compiler will correctly infer that the result of+personWithName:is an instance of aPerson.
Perfect timing: I created a need for this a few days ago. As I was migrating The Magazine to Core Data, I built a simple convenience-utility superclass for my Issue, Article, and Author classes to inherit that mimics my PHP model utilities:
@interface MAManagedObject : NSManagedObject
+ (MAManagedObject *)createWithID:(NSString *)idStr;
+ (MAManagedObject *)findByID:(NSString *)idStr;
+ (NSArray *)findAll;
...
@interface Issue : MAManagedObject
...
That way, I could easily get instanaces like this:
Issue *issue = [Issue findByID:@"whatever"];
But that would throw a compiler warning: issue expects an Issue * but was being assigned, as far as it knew, a MAManagedObject *. So instead, I had to inelegantly cast the result of each call:
Issue *issue = (Issue *)[Issue findByID:self.issueID];
I just changed the method declarations in MAManagedObject to return instancetype instead:
@interface MAManagedObject : NSManagedObject
+ (instancetype)findByID:(NSString *)idStr;
...
And now the compiler is satisfied when assigning subclass calls without the casts.