无法使用类型'(ChecklistItem)'的参数列表调用'indexOf'

时间:2015-08-06 09:45:18

标签: ios iphone xcode swift

当我使用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)
        }
    }

5 个答案:

答案 0 :(得分:34)

要使用indexOfChecklistItem必须采用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 采用或符合等同协议