Невозможно вызвать 'indexOf' с помощью списка аргументов типа '(ChecklistItem)'

Когда я пишу код для поиска элемента из массива с использованием indexOf, он показывает мне указанную выше ошибку. Вот мой код: -

func addItemViewController(controller: AddItemViewController, didFinishEditingItem item: ChecklistItem)
{
    if let index = items.indexOf(item)
    {
        let indexPath = NSIndexPath(forRow: index, inSection: 0)

        if let cell = tableView.cellForRowAtIndexPath(indexPath)
        {
            configureTextForCell(cell, withChecklistItem: item)
        }
    }

Ответы

Ответ 1

Чтобы использовать indexOf, ChecklistItem должен принять Equableable. Только приняв этот протокол, список может сравнивать элемент с другими элементами, чтобы найти нужный индекс

Ответ 2

indexOf может применяться только к коллекциям типов Equatable, ваш ChecklistItem не соответствует протоколу Equatable (имеет оператор ==).

Чтобы использовать indexOf, добавьте это в файл, содержащий класс ChecklistItem в глобальной области:

func ==(lhs: ChecklistItem, rhs: ChecklistItem) -> Bool {
    return lhs === rhs
}

Обратите внимание, что это будет сравнивать, сравнивая адреса адресов в памяти. Вы можете проверить равенство, сравнив членов класса.

Ответ 3

Я понимаю, что этот вопрос уже имеет принятый ответ, но я нашел другой случай, который вызовет эту ошибку, чтобы он мог помочь кому-то другому. Я использую Swift 3.

Если вы создаете коллекцию и позволяете выводить тип, вы также можете увидеть эту ошибку.

Пример:

// UITextfield conforms to the 'Equatable' protocol, but if you create an
// array of UITextfields and leave the explicit type off you will
// also see this error when trying to find the index as below
let fields = [
        tf_username,
        tf_email,
        tf_firstname,
        tf_lastname,
        tf_password,
        tf_password2
    ]

// you will see the error here
let index = fields.index(of: textField)

// to fix this issue update your array declaration with an explicit type
let fields:[UITextField] = [
    // fields here
]

Ответ 4

Возможно, вы не указали тип ChecklistItem, что он равнозначен, возможно, вы забыли упомянуть класс ChecklistItem, наследуемый от NSObject strong > .

import Foundation

class ChecklistItem: NSObject {
  var text = ""
  var checked = false

  func toggleChecked() {
    checked = !checked
  }
}

NSObject принимает или соответствует эквивалентному протоколу

Ответ 5

В Swift 4 и Swift 3 обновите свою модель данных в соответствии с протоколом "Equatable" и реализуйте метод lhs = rhs, только тогда вы можете использовать ".index(из:...)", потому что вы сравниваете свой пользовательский объект

Eg:
class Photo : Equatable{
    var imageURL: URL?
    init(imageURL: URL){
        self.imageURL = imageURL
    }

    static func == (lhs: Photo, rhs: Photo) -> Bool{
        return lhs.imageURL == rhs.imageURL
    }
}

Использование:

let index = self.photos.index(of: aPhoto)