2

有没有办法找出传递给函数的参数是目标 C 中的右值还是左值?例如,

NSString* foo = @"FOO";

[self foobar:@"FOO"];          ...1
[self foobar:foo];             ...2

其中 foobar 是一个函数:

-(void)foobar:(NSString*)str{
    //do something
}

我需要能够在函数 foobar 中找出它是由 (1) 还是 (2) 调用的。我想避免更改函数签名。

谢谢!

4

2 回答 2

2

常量和非常量NSString对象确实有不同的类型,如下所示,但是我不确定这是区分需要翻译的字符串和不需要翻译的字符串的特别好的方法。

您可能应该使用 Apple 自己的Internationalization Support,但我个人将使用Delicious Library作者(其中一位)记录的方法,here

#import <Foundation/Foundation.h>

void foo(NSString *s) {
    NSLog(@"Type of '%@' is %@", s, NSStringFromClass([s class]));
}

int main(int argc, const char **argv) {
    @autoreleasepool {
        NSString *s1 = [NSString stringWithFormat:@"A %@ string", @"formatted"];
        NSString *s2 = @"A constant string";
        foo(s1);
        foo(s2);
    }
    return 0;
}

2013-09-17 16:34:05.667 test[9866:707] Type of 'A formatted string' is __NSCFString
2013-09-17 16:34:05.668 test[9866:707] Type of 'A constant string' is __NSCFConstantString
于 2013-09-17T15:37:01.630 回答
1

不,没有区别,因为两者都是一样的,都传递了一个 NSString 类的对象。

这:

[self foobar:@"FOO"];

与这样做完全相同:

NSString* foo = @"FOO";
[self foobar:foo];

前导的 @@".."表示这个字符串将被创建为 NSString*。

于 2013-09-17T15:01:17.387 回答