私は、新しい Objective-C の添え字が気に入っています。
id anotherObject;
someObject[2] = anotherObject;
しかし、非オブジェクト型に実装することは可能ですか? 例えばvoid *
?
void *myPointer;
someObject[2] = myPointer;
可能とは、エレガンスの概念なしで、本当に可能であることを意味します。
私は、新しい Objective-C の添え字が気に入っています。
id anotherObject;
someObject[2] = anotherObject;
しかし、非オブジェクト型に実装することは可能ですか? 例えばvoid *
?
void *myPointer;
someObject[2] = myPointer;
可能とは、エレガンスの概念なしで、本当に可能であることを意味します。
オブジェクトにインデックス付き添え字を実装するには、次の 2 つのメソッドを実装する必要があります (数値インデックス用)。
- (id)objectAtIndexedSubscript:(NSUInteger)idx;
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
これで、ラップする NSValues を渡し、void*
通常の NSArrays を次のように使用できます。
myArray[i] == [NSValue valueWithPointer:myVoidPtr];
myVoidPtr = [myArray[i] pointerValue];
または、これらのメソッドの独自のバージョンを使用して独自のコレクションを実装しますが、これには、次のようにコレクションの内外でキャストをブリッジする必要があります。
myArray[i] == (__bridge id)myVoidPtr;
myVoidPtr = (__bridge void*)myArray[i];
どちらも非常に満足のいく解決策を提供していません。NSValue ラッピング アプローチは、ラッピングとアンラッピングを行うためのマクロをいくつか使用することで改善できますが、直接のインデックス作成は失われます。