【发布时间】:2011-04-06 13:15:06
【问题描述】:
是否可以覆盖 Objective-C 中的运算符使用?
例如
myClassInstance + myClassInstance
调用自定义函数将两者相加。
【问题讨论】:
标签: objective-c operator-overloading
是否可以覆盖 Objective-C 中的运算符使用?
例如
myClassInstance + myClassInstance
调用自定义函数将两者相加。
【问题讨论】:
标签: objective-c operator-overloading
运算符重载不是 Objective-C 的特性。如果您的类的两个实例可以添加在一起,请提供一个方法并允许使用该方法添加它们:
Thing *result = [thingOne thingByAddingThing:thingTwo];
或者,如果你的类是可变的:
[thingOne addThing:thingTwo];
【讨论】:
不,你不能在 Objective-C 中做到这一点。
【讨论】:
【讨论】:
您可能希望为您的对象支持下标。下标是 not 运算符重载,但它对于集合对象很方便。 NSArray 和 NSDictionary 都支持下标。例如:
NSMutableArray *a = [NSMutableArray new];
a[0] = @"Hello";
支持索引下标的方式是实现如下:
-(id)objectAtIndexedSubscript:(NSUInteger)idx;
-(void)setObject:(id)newObject atIndexedSubscript:(NSUInteger)idx];
【讨论】:
[]在C和C++中都被认为是一个操作符,所以从某种意义上说,objectAtIndexedSubscript:是一种重载操作符的方式。
我知道这是一个老问题,但我只是想把这个答案留给将来可能想知道这是否可能的任何人。
答案是肯定的!
您必须使用 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
希望这对某人有所帮助!
【讨论】:
不,Objective-C 不支持运算符重载。
【讨论】:
首先,运算符重载是邪恶的。其次,C 没有运算符重载,Objective-C 是 C 的适当超集,它只添加了少数关键字和消息语法。
话虽如此,如果您使用的是 Apple 的开发环境,则可以使用 Objective-C++ 而不是 Objective-C,这样您就可以了解 C++ 的所有错误和缺陷,包括运算符重载。使用 Objective-C++ 最简单的方法就是将实现文件的扩展名从“.m”更改为“.mm”
【讨论】: