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

Posted

技术标签:

【中文标题】无法使用“(ChecklistItem)”类型的参数列表调用“indexOf”【英文标题】:Cannot invoke 'indexOf' with an argument list of type '(ChecklistItem)' 【发布时间】:2015-08-06 09:45:17 【问题描述】:

当我编写代码以使用 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)
        
    

【问题讨论】:

如果能把代码的引用放上就好了,我相信是ios学徒这本书的第2章 【参考方案1】:

为了使用indexOfChecklistItem必须采用Equatable protocol。只有采用该协议,列表才能将一个项目与其他项目进行比较以找到所需的索引

【讨论】:

【参考方案2】:

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
    

请注意,它将通过比较内存中的实例地址来进行比较。您可能希望通过比较类的成员来检查相等性。

【讨论】:

还记得通过将 Equatable 添加到类定义中来使您的类符合 Equatable【参考方案3】:

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)

【讨论】:

【参考方案4】:

我意识到这个问题已经有一个可接受的答案,但我发现了另一个会导致此错误的案例,因此它可能对其他人有所帮助。我正在使用 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
]

【讨论】:

【参考方案5】:

可能的原因是你没有告诉 ChecklistItem 类型它是相等的,也许你忘了提到 ChecklistItem 类是继承自 NSObject强>。

import Foundation

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

  func toggleChecked() 
    checked = !checked
  

NSObject采用或符合可等价协议

【讨论】:

从 NSObject 继承是垃圾,应该尽快避免

以上是关于无法使用“(ChecklistItem)”类型的参数列表调用“indexOf”的主要内容,如果未能解决你的问题,请参考以下文章

Java 函数的参数说

无法转换类型“[String : AnyObject]?”的值到预期的参数类型“[NSAttributedStringKey:Any]?”

在Typescript中扩展泛型参数

转换为 Swift3 错误

可以在C ++中使用动态分配的参数数创建函数吗?

.ondelete 带有部分的 SwiftUI 列表