0

文字列が const 構造体にあるかどうかを確認したい。私がそれを行う方法は次のようなものです:

私の MyClass.h で:

extern const struct MyAttributes {
    __unsafe_unretained NSString *attribute1;
    __unsafe_unretained NSString *attribute2;
    __unsafe_unretained NSString *attribute3;
    __unsafe_unretained NSString *attribute4;
    __unsafe_unretained NSString *attribute5;
} MyAttributes;

次に、私の MyClass.m には次のものがあります。

const struct MyAttributes MyAttributes = {
    .attribute1 = @"attribute1",
    .attribute2 = @"attribute2",
    .attribute3 = @"attribute3",
    .attribute4 = @"attribute4",
    .attribute5 = @"attribute5"
};

...

- (void)someMethod
{
    BOOL test1 = [self check:@"test"];
    BOOL test2 = [self check:@"attribute1"];
}

- (BOOL)check:(NSString *)string
{
    return [string isEqualToString:MyAttributes.attribute1] ||
        [string isEqualToString:MyAttributes.attribute2] ||
        [string isEqualToString:MyAttributes.attribute3] ||
        [string isEqualToString:MyAttributes.attribute4] ||
        [string isEqualToString:MyAttributes.attribute5];
}

まあ、これはうまくいきます。しかし、- (void)check更新する場合に更新するMyAttributes必要がないように実装するより良い方法はあり- (void)checkますか?

4

2 に答える 2

1

これを Objective-C 配列に変換して、探している文字列が含まれているかどうかを確認できます。

- (BOOL) check: (NSString*) string {
    // I renamed the variable MyAttributes to myAttributes, following naming conventions
    __unsafe_unretained id* ptr;
    struct MyAttributes* attrPtr= &myAttributes;
    memcpy(&ptr, &attrPtr, sizeof(id*));
    NSArray* array= [NSArray arrayWithObjects: ptr count: sizeof(MyAttributes)/sizeof(NSString*)];
    return [array containsObject: string];
}

C スタイルの方法は、構造体を C 配列として扱うことです。

- (BOOL)check:(NSString *)string {
    BOOL result= NO;
    // I renamed the variable MyAttributes to myAttributes, following naming conventions
    NSString* __unsafe_unretained * strPtr;
    struct MyAttributes* ptr= &myAttributes;
    memcpy(&strPtr, &ptr, sizeof(NSString**));
    for(size_t i=0; i<sizeof(MyAttributes)/sizeof(NSString*) && !result;i++) {
        result= [string isEqualToString: strPtr[i] ];
    }
    return result;
}

PS:memcpy文字列は既に に保持されているため、以前はブリッジ キャスティングを避けていましたmyAttributes

于 2013-09-26T11:58:51.037 に答える