15

私はObjective-Cを初めて使用するので、あまり判断しないでください。私は疑問に思っていました:Objective-Cで使用できるC ++ STLペアコンテナに相当するものはありますか?

NSBoolに関連付けられたNSIntegerを含む配列を作成したいと思います。各エントリが単一のKey-Valueを持つNSDictionaryである配列を使用できることは知っていますが、それは少しやり過ぎだと思います。

何か案は?

ありがとう。

4

5 に答える 5

16

独自のデータ構造オブジェクトを作成できます。このような単純なケースの場合、非常に簡単です。

@interface Pair : NSObject 
{
    NSInteger integer;
    BOOL      boolean;
}
@property (nonatomic, assign) integer;
@property (nonatomic, assign) boolean;
@end

そして、一致する実装を行うと、PairオブジェクトをNSArray問題なく固定できます。

于 2010-08-19T17:14:30.580 に答える
7

STLはObjective-C++で使用できます。.mファイルの拡張子を.mmに変更するだけで、.mの#import代わりに使用することをお勧めします#include。そうすれば、ペアのSTLコンテナを使用できます。

于 2010-08-19T17:07:16.127 に答える
1

匿名の構造体と構造体リテラルを使用すると、次のようなことができる可能性があります

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];

ただし、構造体に名前を付けると少しすっきりします。

于 2010-08-19T19:39:34.163 に答える
0

以下のコードのような、関連付けられたオブジェクトを使用する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];
于 2010-08-19T17:34:21.227 に答える
0

さらに別のオプションは、ペアを格納するために単一エントリの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

この代替案は特にお勧めしませんが、その優れた点と利点があります。

于 2019-03-18T14:20:08.847 に答える