快速解析 Objective-C 中的 Phone 个联系人对象

Quickly Parse Phone Numbers of Contact Object in Objective-C

我想知道是否有比一个一个检查并确定联系人中的哪些 phone 号码更有效的方法。也许有字典或数组方法,我只是模模糊糊地意识到它们适用于处理不同联系人的 phone 号码的不同集合。

联系人对象有 phone 号码和很多种类的字符串,移动、办公室、家庭、传真、主要、免费等

我使用的愚蠢方法如下:

NSString *office = myContact.officetel;
NSString *home = myContact.hometel;
NSString *mobile - myContact.mobiletel;

NSMutableArray *phonenums = [@[] mutableCopy]; 
if (office.length>=1) {
[phonenums addObject: office];
etc.
}

当我组装好这个数组后,我可以计算它的成员,看看是否有一个或多个等等。然而,这似乎是一种乏味且低效的方法。

我的目标是能够快速识别是否只有一个 phone 号码,如果有的话,五分之三,向用户提供这些可能性。

只是想知道是否有比上述方法更强大、更有效的方法。

很简单。这是如何完成的(伪代码).

NSArray numbers  = @[
     myContact.officetel,
     myContact.hometel,
     myContact.mobiletel
];

NSMutableArray *phonenums = [NSMutableArray  new]; 

for(NSString *number in phonenums) {
    if(number.length){
        [phonenums addObject: number];
    }
}

它甚至可以更短,但可读性较差:

NSMutableArray *phonenums = [NSMutableArray  new]; 

for(NSString *number in @[myContact.officetel, myContact.hometel, myContact.mobiletel]) {
    if(number.length){
        [phonenums addObject: number];
    }
}

更新上面的代码:使用数组文字(语法糖)将对象预填充到 NSArray 中,即使用 @[a, b, c] 可能不安全,如果这些元素中的任何一个都可能为零。因此,在这种情况下,您必须确保 Contact class return 上每个数字属性的 getter 为空字符串(如果数字为 nil)。

为了在评论中解决您的请求,您可以在联系人 class 上添加一个名为 availableNumbers 的函数,这将 return 一个包含键和数字的字典。键是号码的名称,例如 office,值是号码本身:

将此添加到您的 Contact.m class(或任何您称之为的名称)

-(NSDictionary*)availableNumbers
{
    NSDictionary *keyedNumbers = [[NSMutableDictionary alloc] init];

    if(self.officetel.length) {
        [keyedNumbers  setObject: self.officetel  forKey: @"officetel"];
    }
    if(self.hometel.length) {
        [keyedNumbers  setObject: self.hometelforKey: @"hometel"];
    }
    if(self.mobiletel.length) {
        [keyedNumbers  setObject: self.mobiletelforKey: @"mobiletel"];
    }

    return keyedNumbers ;
}

记得在你的.h文件中添加-(NSDictionary*)availableNumbers这样方法就是public