是否可以覆盖Objective-C中的操作符使用?
例如
myClassInstance + myClassInstance
调用自定义函数来添加两者。
答案 0 :(得分:90)
运算符重载不是Objective-C的一项功能。如果可以将两个类的实例一起添加,请提供方法并允许使用该方法添加它们:
Thing *result = [thingOne thingByAddingThing:thingTwo];
或者,如果你的班级是可变的:
[thingOne addThing:thingTwo];
答案 1 :(得分:16)
不,你不能在Objective-C中这样做。
答案 2 :(得分:7)
答案 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”