在Objective-C中快速解析联系人对象的电话号码

时间:2018-10-29 22:10:35

标签: ios objective-c nsstring nsarray

我想知道是否有一种比逐个检查并检查更有效的方法来标识联系人中的哪些电话号码。也许有一些字典或数组方法,我只是模糊地意识到,这对于处理不同联系人的不同电话号码集合将是一件好事。

联系人对象包含电话号码字符串和多种类型,包括移动电话,办公室,家庭,传真,主要电话,免费电话等。

我正在使用的愚蠢方法如下:

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

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

组装完这个数组后,我可以对它的成员进行计数,看是否有一个或多个,依此类推。但是,这似乎是一种乏味且效率低下的方法。

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

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

1 个答案:

答案 0 :(得分:1)

容易。就是这样(伪代码)

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]可能是不安全的可能为零。因此,在这种情况下,您必须确保如果数字为nil,则Contact类上每个数字属性的getter返回空字符串。

要在注释中满足您的请求,您可以在Contact类上添加一个名为availableNumbers的函数,该函数将返回包含键和数字的字典。密钥将是数字的名称,例如办公室,而值将是数字本身:

将此内容添加到您的Contact.m(或您所说的任何内容)

-(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 ;
}

请记住将-(NSDictionary*)availableNumbers添加到您的.h文件中,以便该方法是公共的