我可以在Objective-C中重载运算符吗?

时间:2010-08-31 23:36:28

标签: objective-c operator-overloading

是否可以覆盖Objective-C中的操作符使用?

例如

myClassInstance + myClassInstance

调用自定义函数来添加两者。

7 个答案:

答案 0 :(得分:90)

运算符重载不是Objective-C的一项功能。如果可以将两个类的实例一起添加,请提供方法并允许使用该方法添加它们:

Thing *result = [thingOne thingByAddingThing:thingTwo];

或者,如果你的班级是可变的:

[thingOne addThing:thingTwo];

答案 1 :(得分:16)

不,你不能在Objective-C中这样做。

答案 2 :(得分:7)

您现在可以在Swift中执行此操作,这是objC的继承者。而且,由于Objective-C和Swift一起工作,This对你来说很有意思。

答案 3 :(得分:3)

您可能希望支持订阅您的对象。订阅是运算符重载,但它对于集合对象可以很方便。 NSArray和NSDictionary都支持下标。例如:

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

支持索引下标的方法是实现以下内容:

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

答案 4 :(得分:1)

我知道这是一个古老的问题,但是我只是想把这个答案留给将来可能想知道这是否可能的任何人。

答案是肯定的!

您将不得不使用一个名为Objective-C ++的Objective-C变体。 例如,假设您创建了一个新的Objective-C命令行工具项目。为了允许C ++功能,您需要将“ main.m”重命名为“ main.mm”。之后,您可以将C ++代码与Objective-C代码混合在同一文件中。有一些限制,但是我已经测试了运算符重载,并且据我所知,它似乎可以很好地与Objective-C对象一起工作。 我提供了示例源代码,以使您了解如何执行此操作:

//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;
}

这是构建并运行以下代码后的输出:

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

希望这会对某人有所帮助!

答案 5 :(得分:0)

不,Objective-C不支持运算符重载。

答案 6 :(得分:-28)

首先,运算符重载是 evil 。其次,C没有运算符重载,而Objective-C是C的正确超集,它只添加了少量关键字和消息语法。

话虽如此,如果您使用的是Apple的开发环境,您可以使用Objective-C ++而不是Objective-C,这样您就可以访问C ++的所有错误和错误,包括运算符重载。使用Objective-C ++最简单的方法就是将实现文件的扩展名从“.m”更改为“.mm”