私はObjective-Cを初めて使用するので、あまり判断しないでください。私は疑問に思っていました:Objective-Cで使用できるC ++ STLペアコンテナに相当するものはありますか?
NSBoolに関連付けられたNSIntegerを含む配列を作成したいと思います。各エントリが単一のKey-Valueを持つNSDictionaryである配列を使用できることは知っていますが、それは少しやり過ぎだと思います。
何か案は?
ありがとう。
私はObjective-Cを初めて使用するので、あまり判断しないでください。私は疑問に思っていました:Objective-Cで使用できるC ++ STLペアコンテナに相当するものはありますか?
NSBoolに関連付けられたNSIntegerを含む配列を作成したいと思います。各エントリが単一のKey-Valueを持つNSDictionaryである配列を使用できることは知っていますが、それは少しやり過ぎだと思います。
何か案は?
ありがとう。
独自のデータ構造オブジェクトを作成できます。このような単純なケースの場合、非常に簡単です。
@interface Pair : NSObject
{
NSInteger integer;
BOOL boolean;
}
@property (nonatomic, assign) integer;
@property (nonatomic, assign) boolean;
@end
そして、一致する実装を行うと、Pair
オブジェクトをNSArray
問題なく固定できます。
STLはObjective-C++で使用できます。.mファイルの拡張子を.mmに変更するだけで、.mの#import
代わりに使用することをお勧めします#include
。そうすれば、ペアのSTLコンテナを使用できます。
匿名の構造体と構造体リテラルを使用すると、次のようなことができる可能性があります
NSValue * v = [NSValue valueWithBytes:(struct {NSInteger i; bool b;}){i,b} objCType:(struct {NSInteger i; bool b;})];
そして読むために、
struct {NSInteger i; bool b;} foo;
[v getValue:&foo];
ただし、構造体に名前を付けると少しすっきりします。
以下のコードのような、関連付けられたオブジェクトを使用するNSNumberのペアカテゴリはどうですか(関連付けられたオブジェクトがいつ導入されたかわからないため、テストされていないため、iOS4が必要になる場合があります)。
#import <objc/runtime.h>
@implementation NSNumber(Pair)
#define PAIR_KEY 'p'
- (NSNumber *) pairNumber:(NSNumber *)second
{
char secondKey = PAIR_KEY;
objc_setAssociatedObject(self, &secondKey, second, OBJC_ASSOCIATION_RETAIN);
return self;
}
- (NSNumber *) pairedNumber
{
char secondKey = PAIR_KEY;
NSNumber *associatedObject = (NSNumber *)objc_getAssociatedObject(self, &secondKey);
return associatedObject;
}
@end
あなたはそれを次のように使うでしょう:
BOOL myBool = NO;
NSNumber *storedBool = [NSNumber numberWithBool:myBool];
[myOtherNumber pairNumber:storedBool];
そしてそれを引き出すために:
NSNumber *boolNumber = [myOtherNumber pairedNumber];
さらに別のオプションは、ペアを格納するために単一エントリのNSDictionaryを(ab)使用することです。NSDictionaryは、型指定された「キー」と「値」を強制するように定義でき、構文糖衣としてリテラルもサポートするためです。欠点-ペアはNSObject(インスタンス参照)のみを保持でき、プリミティブ値は保持できません。
サンプルは次のようになります。
typedef NSDictionary<NSString *, NSDate *> *Pair;
そしてあなたのコードで:
Pair myPair = @{@"my name": [NSDate date]};
Pair myOtherPair = @{@"his name": [NSDate date]};
NSArray<Pair> *myArrayOfPairs = @[myPair, myOtherPair];
続けて結果を印刷します。
NSLog(@"%@", myArrayOfPairs);
そしてそれはあなたが期待するものと非常によく似ています。
2019-03-18 16:08:21.740667+0200 TesterApp[23135:23269890] (
{
"my name" = "2019-03-18 14:08:21 +0000";
},
{
"his name" = "2019-03-18 14:08:21 +0000";
}
)
いわゆる「ペア」から値を抽出しようとすると、回収時間が発生します。NSDictionaryからその単一のエントリを実際に掘り下げる必要があります。通常の「キー」ではなく、次のようにエントリが1つしかないことを前提としています。
Pair somePair = myArrayOfPairs.lastObject;
NSString *name = somePair.allKeys.firstObject;
NSDate *date = somePair.allValues.firstObject;
NSLog(@"name: %@ date: %@", name, date);
最終的には次のようになります。
name: his name date: Mon Mar 18 16:16:43 2019
この代替案は特にお勧めしませんが、その優れた点と利点があります。