5

我来自 c++,我正在尝试为文本字段中的用户输入创建验证器类。我的函数需要返回一个bool和一个消息(如果bool是 YES 消息是NULL)。Objective-C 中是否有类似于std::pairC++ 的内容(包含一对值)?

4

3 回答 3

7

好吧,不完全是一对,但你有几个选择:

一。使用数组或字典(“标准集合类”):

NSArray *pair1 = @[@NO, @"Foo"];
NSArray *pair2 = @[@YES, [NSNull null]];

或者

NSDictionary *pair = @{@"Flag" : @NO, @"Message" : @"Foo" };

所以你明白了……

二:如果它还不存在,为什么不编写自己的 Pair 类?

@interface MyPair: NSObject

@property (assign) BOOL flag;
@property (strong) NSString *message;

@end
于 2013-02-09T22:46:37.387 回答
7

可可中没有std::pair;你可以创建你自己的。但是,解决该问题的更惯用的方法类似于其他返回错误的方法,即,将指针传递给指向错误的指针,然后返回BOOL

-(BOOL) validateInput:(id)input error:(NSError**)errPtr {
    // Validate the input
    // If the input is valid, do not assign `errPtr`, and return `YES`
    // Otherwise, create a `NSError` object, and assign to errPtr
}

您可以按如下方式调用此方法:

NSError *err;
if (![validator validateInput:@"some input" error:&err]) {
    // Show the error
}

有关如何在 Cocoa 中使用此习惯用法的示例,请参见类的regularExpressionWithPattern:options:error:方法NSRegularExpression

于 2013-02-09T22:47:11.087 回答
5

为什么不尝试使用 Objective-C++?只需使用.mm扩展名命名您的源文件,然后您就可以将 c++ 与 Objective-c 混合使用。你不能混合类,但你可以使用标准模板的东西。因此,在某些对象 Foo 中,我有一个带有以下代码的方法 doFoo:

std::pair<id, NSString*> foo;

foo.first = @"First";
foo.second = @"second";

NSLog(@"%@ %@", foo.first, foo.second);
于 2013-02-10T02:01:04.157 回答