Can I overload an operator in Objective-C?

后端 未结 7 558
萌比男神i
萌比男神i 2020-12-15 15:02

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

For example

myClassInstance + myClassInstance

calls a custom function to ad

相关标签:
7条回答
  • 2020-12-15 15:29

    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 讨论(0)
  • 2020-12-15 15:32

    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.

    0 讨论(0)
  • 2020-12-15 15:34

    No, Objective-C does not support operator overloading.

    0 讨论(0)
  • 2020-12-15 15:42

    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];
    
    0 讨论(0)
  • 2020-12-15 15:47

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

    0 讨论(0)
  • 2020-12-15 15:49

    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!

    0 讨论(0)
提交回复
热议问题