Cannot invoke 'indexOf' with an argument list of type '(ChecklistItem)'

后端 未结 5 1254
抹茶落季
抹茶落季 2020-12-10 01:36

When I am writing code for finding an item from the array with the use of indexOf it shows me the above stated error. Here is my code:-

func addItemViewContr         


        
相关标签:
5条回答
  • 2020-12-10 01:56

    In order to use indexOf the ChecklistItem must adopt Equatable protocol. Only by adopting this protocol the list can compare an item with other items to find the desired index

    0 讨论(0)
  • 2020-12-10 02:01

    In Swift 4 and Swift 3, update your Data Model to conform to "Equatable" protocol, and implement the lhs=rhs method , only then you can use ".index(of:...)", because you are comparing your custom object

    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
        }
    }
    

    Usage:

    let index = self.photos.index(of: aPhoto)
    
    0 讨论(0)
  • 2020-12-10 02:09

    indexOf can only be applied to Collections of Equatable types, your ChecklistItem doesn't conform to Equatable protocol (have an == operator).

    To be able to use indexOf add this to the file containing ChecklistItem class in the global scope :

    func ==(lhs: ChecklistItem, rhs: ChecklistItem) -> Bool {
        return lhs === rhs
    }
    
    Swift3: 
    public static func ==(lhs: Place, rhs: Place) -> Bool {
            return lhs === rhs
        }
    

    Please note it will make comparison by comparing instances addresses in memory. You may want to check equality by comparing members of the class instead.

    0 讨论(0)
  • 2020-12-10 02:15

    I realize this question already has an accepted answer, but I found another case that will cause this error so it might help someone else. I'm using Swift 3.

    If you create a collection and allow the type to be inferred you may also see this error.

    Example:

    // 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
    ]
    
    0 讨论(0)
  • 2020-12-10 02:15

    The possible reason is you didn't tell the ChecklistItem type that it is equatable, maybe you forgot to mention ChecklistItem class is inherited from NSObject.

    import Foundation
    
    class ChecklistItem: NSObject {
      var text = ""
      var checked = false
    
      func toggleChecked() {
        checked = !checked
      }
    }
    

    NSObject adopts or conforms to the equatable protocol

    0 讨论(0)
提交回复
热议问题