当我使用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)
}
}
答案 0 :(得分:34)
要使用indexOf
,ChecklistItem
必须采用Equatable protocol。只有采用此协议,列表才能将项目与其他项目进行比较,以找到所需的索引
答案 1 :(得分:14)
indexOf
只能应用于Equatable
类型的集合,您的ChecklistItem
不符合Equatable
协议(拥有==
运营商)。
为了能够使用indexOf
将其添加到全局范围内包含ChecklistItem
类的文件中:
func ==(lhs: ChecklistItem, rhs: ChecklistItem) -> Bool {
return lhs === rhs
}
Swift3:
public static func ==(lhs: Place, rhs: Place) -> Bool {
return lhs === rhs
}
请注意,它将通过比较内存中的实例地址进行比较。您可能希望通过比较类的成员来检查相等性。
答案 2 :(得分:5)
在 Swift 4和Swift 3 中,更新您的数据模型以符合" Equatable"协议,并实现lhs = rhs方法,只有这样你才能使用" .index(of:...)",因为你正在比较你的自定义对象
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)
答案 3 :(得分: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 :(得分:3)
可能的原因是你没有告诉 ChecklistItem 类型它是等同的,也许你忘了提及 ChecklistItem 类继承自 NSObject 即可。
import Foundation
class ChecklistItem: NSObject {
var text = ""
var checked = false
func toggleChecked() {
checked = !checked
}
}
NSObject 采用或符合等同协议