开发者

Can I overload an operator in Objective-C?

Is it possible to override operator use i开发者_运维知识库n Objective-C?

For example

myClassInstance + myClassInstance

calls a custom function to add the two.


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];


No, you can't do this in 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.


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];


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!


No, Objective-C does not support operator overloading.


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"

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜