【问题标题】:Equivalent of C++ STL container "pair<T1, T2>" in Objective-C?Objective-C 中 C++ STL 容器“pair<T1, T2>”的等价物?
【发布时间】:2011-04-01 06:05:35
【问题描述】:

我是 Objective-C 的新手,所以请不要过多评价我。我想知道:有没有可以在 Objective-C 中使用的等效 C++ STL 对容器?

我想构建一个包含与 NSBool 关联的 NSInteger 的数组。我知道我可以使用一个数组,每个条目都是一个具有单个键值的 NSDictionary,但我发现它有点矫枉过正。

有什么想法吗?

谢谢。

【问题讨论】:

  • 虽然在 Objective-C(或实际上 - Cocoa Foundation 框架)中没有自然替代“Pair”,但以下几个答案提供了可以使用的可接受的解决方案。我还添加了一个有点强制的解决方案,它的行为方式类似 - 但选择正确的解决方案在很大程度上取决于您对此的实际使用。

标签: iphone c++ objective-c stl std-pair


【解决方案1】:

您可以在 Objective-C++ 中使用 STL。您需要做的就是将.m 文件的扩展名更改为.mm,我还建议您使用#import 而不是#include。这样你就可以使用你的pair STL容器了。

【讨论】:

  • 请记住,STL 容器没有 retainrelease 对象。
【解决方案2】:

您可以编写自己的数据结构对象 - 对于这样一个简单的情况,这将非常容易:

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

还有一个匹配的实现,然后你将你的 Pair 对象粘贴到 NSArray 中没有问题。

【讨论】:

  • @Martin,绝对正确。但 OP 似乎表明他想要一对特定的。将这里的两个属性替换为 id 即可完成工作。
【解决方案3】:

NSNumber 上使用关联对象的 Pair 类别怎么样,类似于下面的代码(未经测试,可能需要 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];

【讨论】:

    【解决方案4】:

    使用匿名结构和结构字面量,你也许可以做类似的事情

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

    如果你命名你的结构,它会更简洁。

    【讨论】:

      【解决方案5】:

      另一个选择是(ab)使用单条目 NSDictionary 来存储该对 - 因为现在可以定义 NSDictionary 以强制键入“键”和“值”,并且还支持文字作为语法糖。缺点 - 该对只能保存 NSObjects(实例引用)而不是原始值。

      示例如下所示:

      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 中挖掘单个条目,而不是像往常一样通过其“Key”,而是假设只有一个条目,如下所示:

      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
      

      我并不特别推荐这种替代方案,但它有其优点和优点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-08
        • 1970-01-01
        • 2021-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        相关资源
        最近更新 更多