2

関数に渡された引数が Objective C の右辺値か左辺値かを調べる方法はありますか? 例えば、

NSString* foo = @"FOO";

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

ここで、foobar は関数です。

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

(1) または (2) によって呼び出された場合、関数 foobar 内で見つけることができる必要があります。関数のシグネチャを変更する必要はありません。

ありがとう!

4

2 に答える 2

2

以下に示すように、定数オブジェクトと非定数NSStringオブジェクトには異なる型がありますが、これが翻訳が必要な文字列とそうでない文字列を区別する特に良い方法であるかどうかはわかりません。

おそらく Apple 独自のInternationalization Supportを使用する必要がありますが、個人的には、 Delicious Libraryの作成者 (の 1 人) によって文書化されているこちらのアプローチを使用します。

#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 に答える