Can I overload an operator in Objective-C?

Objective COperator Overloading

Objective C Problem Overview


Is it possible to override operator use in Objective-C?

For example

myClassInstance + myClassInstance

calls a custom function to add the two.

Objective C Solutions


Solution 1 - Objective C

Operator overloading is not a feature of Objective-C. If two instances of your classes can be added together, provide a method and allow them to be added using that method:

Thing *result = [thingOne thingByAddingThing:thingTwo];

Or, if your class is mutable:

[thingOne addThing:thingTwo];

Solution 2 - Objective C

No, you can't do this in Objective-C.

Solution 3 - Objective C

You can do this now in Swift, a successor to objC. And since Objective-C and Swift are made to work together This could be interesting for you.

Solution 4 - Objective C

You may want to support subscripting for your object. Subscripting is not operator overloading, but it can be handy for a collection object. NSArray and NSDictionary both support subscripting. For example:

NSMutableArray *a = [NSMutableArray new]; a[0] = @"Hello";

The way to support index subscripting is to implement the following:

-(id)objectAtIndexedSubscript:(NSUInteger)idx; -(void)setObject:(id)newObject atIndexedSubscript:(NSUInteger)idx];

Solution 5 - Objective C

I know this is an old question but I just wanted to leave this answer here for anybody in the future that might want to know if this is a possibility.

The answer is YES!

You'll have to use a variant of Objective-C called Objective-C++. As an example, say you created a new Objective-C command-line tool project. In order to allow C++ functionality, you'll need to rename "main.m" to "main.mm". Afterwards, you can mix C++ code in with your Objective-C code in the same file. There are some limitations, but I've tested operator overloading and it seems to work perfectly fine with Objective-C objects as far as I can tell. I've included sample source code to give you an idea of how to do it:

//main.mm
#import <Foundation/Foundation.h>
#include <iostream>
#include <string>

std::ostream &operator<<(std::ostream &os, NSString *s) {
    os << [s UTF8String];
    return os;
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        NSString *str = @"I'm an NSString!";
        std::cout << str << std::endl;
        
    }
    return 0;
}

Here's my output after building and running this code:

> I'm an NSString! > Program ended with exit code: 0

Hopefully this will be of help to somebody!

Solution 6 - Objective C

No, Objective-C does not support operator overloading.

Solution 7 - Objective C

First, operator overloading is evil. Second, C doesn't have operator overloading, and Objective-C is a proper superset of C, which only adds a handful of keywords and a messaging syntax.

That being said, if you're using Apple's development environment, you can use Objective-C++ instead of Objective-C, which gives you access to all of C++'s mistakes and misfeatures, including operator overloading. The simplest way to use Objective-C++ is just to change the extension on your implementation files from ".m" to ".mm"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Question123hal321View Question on Stackoverflow
Solution 1 - Objective CdreamlaxView Answer on Stackoverflow
Solution 2 - Objective CVadim ShenderView Answer on Stackoverflow
Solution 3 - Objective CDamiaan DufauxView Answer on Stackoverflow
Solution 4 - Objective CjackView Answer on Stackoverflow
Solution 5 - Objective CJared S jscorpio87View Answer on Stackoverflow
Solution 6 - Objective CDURGESHView Answer on Stackoverflow
Solution 7 - Objective CNSResponderView Answer on Stackoverflow