我是 Objective-C 的新手,所以请不要过多地评价我。我想知道:有没有可以在 Objective-C 中使用的 C++ STL 对容器的等价物?
我想构建一个包含与 NSBool 关联的 NSInteger 的数组。我知道我可以使用一个数组,每个条目都是一个具有单个键值的 NSDictionary,但我发现它有点矫枉过正。
有任何想法吗?
谢谢。
我是 Objective-C 的新手,所以请不要过多地评价我。我想知道:有没有可以在 Objective-C 中使用的 C++ STL 对容器的等价物?
我想构建一个包含与 NSBool 关联的 NSInteger 的数组。我知道我可以使用一个数组,每个条目都是一个具有单个键值的 NSDictionary,但我发现它有点矫枉过正。
有任何想法吗?
谢谢。
您可以编写自己的数据结构对象 - 对于这样一个简单的情况,这将非常容易:
@interface Pair : NSObject
{
NSInteger integer;
BOOL boolean;
}
@property (nonatomic, assign) integer;
@property (nonatomic, assign) boolean;
@end
和一个匹配的实现,然后你将你的Pair
对象免费放入NSArray
问题中。
您可以在 Objective-C++ 中使用 STL。您需要做的就是将 .m 文件的扩展名更改为 .mm ,我还建议您使用#import
而不是#include
. 这样您就可以使用您的pair 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 上使用关联对象的 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];
另一种选择是(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 中挖掘该单个条目,而不是像往常一样通过其“密钥”,而是假设只有一个条目,如下所示:
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
我并不特别推荐这种替代方案,但它有其优点和好处。