【问题标题】:Can I overload an operator in Objective-C?我可以在 Objective-C 中重载运算符吗?
【发布时间】:2011-04-06 13:15:06
【问题描述】:

是否可以覆盖 Objective-C 中的运算符使用?

例如

myClassInstance + myClassInstance

调用自定义函数将两者相加。

【问题讨论】:

    标签: objective-c operator-overloading


    【解决方案1】:

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

    Thing *result = [thingOne thingByAddingThing:thingTwo];
    

    或者,如果你的类是可变的:

    [thingOne addThing:thingTwo];
    

    【讨论】:

    • 连接字符串很痛苦。
    【解决方案2】:

    不,你不能在 Objective-C 中做到这一点。

    【讨论】:

    • 有什么原因吗?
    【解决方案3】:

    您现在可以在 objC 的继承者 Swift 中执行此操作。由于 Objective-C 和 Swift 可以一起工作,This 对你来说可能会很有趣。

    【讨论】:

    • 查看 Apple 开发者网站上的 Swift page。它说:Swift 是 C 和 Objective-C 语言的继承者。
    • 好的。你能发布一个具体的例子吗?据我了解,Swift 代码可能包含在 Objective C 中。
    【解决方案4】:

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

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

    支持索引下标的方式是实现如下:

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

    【讨论】:

    • 其实[]在C和C++中都被认为是一个操作符,所以从某种意义上说,objectAtIndexedSubscript:是一种重载操作符的方式。
    【解决方案5】:

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

    答案是肯定的!

    您必须使用 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++!
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      首先,运算符重载是邪恶的。其次,C 没有运算符重载,Objective-C 是 C 的适当超集,它只添加了少数关键字和消息语法。

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

      【讨论】:

      • 我认为断然说它是邪恶的并不公平。它在 Smalltalk、Ruby、Python 或 Haskell 中似乎不会造成大问题。
      • 如果您需要重新创建基本数据类型。 (我确实这样做了)失去运算符重载正在削弱 A+B*C-D 变为 A.add(B.times(C)).Minus(C))
      • 你无意中给出了一个为什么重载是邪恶的例子。将贝塞尔曲线相乘意味着什么?
      • 所以让我理解一下:如果我有自己编写的 Vector 类型(对于每种游戏编程语言)或类似的东西,你更喜欢写 myVector.Add(theOtherVector).Cross(somethingElse) 代替的 (myVector + theOtherVector) * somethingElse?抱歉,这个答案完全是主观的,绝对没有解释。
      • “运算符重载 = 邪恶”.. 无知是最好的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 2011-11-27
      • 1970-01-01
      相关资源
      最近更新 更多