Ответ 1
Чтобы использовать indexOf
, ChecklistItem
должен принять Equableable. Только приняв этот протокол, список может сравнивать элемент с другими элементами, чтобы найти нужный индекс
Когда я пишу код для поиска элемента из массива с использованием 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)
}
}
Чтобы использовать indexOf
, ChecklistItem
должен принять Equableable. Только приняв этот протокол, список может сравнивать элемент с другими элементами, чтобы найти нужный индекс
indexOf
может применяться только к коллекциям типов Equatable
, ваш ChecklistItem
не соответствует протоколу Equatable
(имеет оператор ==
).
Чтобы использовать indexOf
, добавьте это в файл, содержащий класс ChecklistItem
в глобальной области:
func ==(lhs: ChecklistItem, rhs: ChecklistItem) -> Bool {
return lhs === rhs
}
Обратите внимание, что это будет сравнивать, сравнивая адреса адресов в памяти. Вы можете проверить равенство, сравнив членов класса.
Я понимаю, что этот вопрос уже имеет принятый ответ, но я нашел другой случай, который вызовет эту ошибку, чтобы он мог помочь кому-то другому. Я использую 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
]
Возможно, вы не указали тип ChecklistItem, что он равнозначен, возможно, вы забыли упомянуть класс ChecklistItem, наследуемый от NSObject strong > .
import Foundation
class ChecklistItem: NSObject {
var text = ""
var checked = false
func toggleChecked() {
checked = !checked
}
}
NSObject принимает или соответствует эквивалентному протоколу
В 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)