Быстро разобрать номера телефонов контактного объекта в Objective-C - PullRequest
0 голосов
/ 30 октября 2018

Мне интересно, существует ли более эффективный способ определения номеров телефонов в контакте, чем просмотр одного за другим и проверка. Возможно, существуют методы словаря или массива, о которых мне только смутно известно, которые были бы хороши для работы с различными наборами телефонных номеров для разных контактов.

У объекта контакта есть строки для номера телефона и множества вариантов: мобильный, офисный, домашний, факс, основной, бесплатный и т. Д.

Глупый подход, который я использую, состоит в следующем:

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 голосов
/ 30 октября 2018

Easy as. Вот как это можно сделать (псевдокод) .

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 возвращают пустую строку, если число равно nil.

Чтобы ответить на ваш запрос в комментариях, вы можете добавить в класс 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, чтобы метод был общедоступным

...