Используя swift, я пытаюсь получить значение индекса определенной метки в массиве меток телефонных номеров.

Я пытаюсь получить значение индекса массива телефонных меток CNLabelValue. Я мог бы перебрать их и получить это таким образом, но я знаю, что метод .idex будет работать, просто не могу понять синтаксис после:

let labelIndex = mutableContact.phoneNumbers.index(of: <#T##CNLabeledValue<CNPhoneNumber>#>)

person Jeremy Andrews    schedule 06.08.2017    source источник
comment
эй, не могли бы вы быть немного яснее о том, что вы хотите спросить / сделать?   -  person Umar Farooque    schedule 06.08.2017


Ответы (3)


Может быть, вы ищете это: -

let arr = ["a","b","c"]
if let index = arr.index(where: { (item) -> Bool in
  return (item == "c") 
}) {
    print(index)
}

Выход: 2

person Hussain Shabbir    schedule 06.08.2017
comment
Спасибо, однако я попробовал это с массивом CNLabeledValue и получил сообщение об ошибке: PhoneLabelsTableViewController.swift:281:18: бинарный оператор '==' не может быть применен к операндам типа 'CNLabeledValue‹CNPhoneNumber›' и 'String'. тип выпуска - person Jeremy Andrews; 07.08.2017
comment
Для этого вам необходимо соответствовать равному протоколу. - person Hussain Shabbir; 07.08.2017

Вы должны сделать что-то вроде этого:

let idx = mutableContact.phoneNumbers.index(where: { (model) -> Bool in

        return if model == YOUR_OBJ

})

здесь,

(модель) имеет тип CNPhoneNumber

а в чеке if вы должны поставить чек, для которого вы хотите получить индекс.

(модель) следует сравнивать с вашим собственным объектом, для которого вы хотите выполнить фильтрацию.

person Umar Farooque    schedule 06.08.2017
comment
Спасибо - попробую это - я использовал итерацию, и это сработало, но это долгий путь. - person Jeremy Andrews; 06.08.2017
comment
Круто, дай мне знать, если тебе понадобится помощь. Однако старайтесь избегать повторений. - person Umar Farooque; 06.08.2017
comment
Сейчас я пробую код, но не понимаю, какой будет (модель). Я думаю, что следующий подход может быть правильным. Я просто не понимаю синтаксиса: let idx = mutableContact.phoneNumbers.index(of: CNLabeledValue, iPhone) Выдает следующую ошибку: .... PhoneLabelsTableViewController.swift:280:42: Метки аргументов '(of:, _:)' не соответствуют ни одной из доступных перегрузок. - person Jeremy Andrews; 07.08.2017
comment
модель уже имеет тип, который вы используете, т.е. phoneNumbers, просто введите любое имя, например модель или obj, чтобы ссылаться на индекс, пока функция index(of:) выполняет итерацию по вашей коллекции - person Umar Farooque; 07.08.2017
comment
kaleidosblog. com/ должно помочь. - person Umar Farooque; 07.08.2017
comment
Спасибо за помощь - не могу понять правильно ни с ответами Умара, ни с Хуссейном, поэтому в качестве обходного пути я использовал итерацию - см. Мой ответ. Работает нормально, но не так. - person Jeremy Andrews; 07.08.2017

var labelIndex = 0

for (i,bod) in mutableContact.phoneNumbers.enumerated() {
    print(i,bod.label!)
    if bod.label == labelP {labelIndex = i; break}      
}

mutableContact.phoneNumbers.remove(at: labelIndex)

Процедура для перебора всех значений CNLabelValues ​​для .phonenumbers, а затем проверки их соответствия labelP (параметру функции) и возврата индекса (labelIndex = i) соответствующего элемента.

затем mutableContact.phoneNumbers.remove(at: labelIndex)`

person Jeremy Andrews    schedule 07.08.2017
comment
Пожалуйста, добавьте информацию о своем ответе - person user7294900; 07.08.2017
comment
Вам лучше объяснить свое решение, а не просто публиковать код. Возможно, стоит прочитать Как написать хороший ответ. - person Massimiliano Kraus; 07.08.2017