2015-08-06 9 views
16

Dizinden bir öğe bulmak için kod yazarken, indexOf kullanarak bana yukarıda belirtilen hatayı gösterir. İşte benim kodudur: -'indexOf', '(ChecklistItem)' türünde bir argüman listesiyle başlatılamıyor '

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

Eğer bu kitabın 2. bölümü olduğuna inandığım kodun atıfta bulunabileceğini düşünürseniz iyi olur ** iOS çırak ** – SLN

cevap

26

indexOf'u kullanmak için ChecklistItem, Equatable protocol'u kabul etmelidir. Sadece bu protokolü benimseyerek, liste, bir öğeyi bir sonraki öğeyi bulmak için diğer öğelerle karşılaştırabilir

10

indexOf sadece Equatable tiplerinin Koleksiyonu uygulanabilir, senin ChecklistItemEquatable protokolü (bir == operatörü var) uymuyor.

func ==(lhs: ChecklistItem, rhs: ChecklistItem) -> Bool { 
    return lhs === rhs 
} 

bellekte örneklerini adreslerini karşılaştırarak karşılaştırma yapacak unutmayın:

küresel kapsamda ChecklistItem sınıfını içeren dosyaya bu eklemek indexOf kullanmak edebilmek. Bunun yerine, sınıfın üyelerini karşılaştırarak eşitliği kontrol etmek isteyebilirsiniz.

+0

tamam ... yardımınız için teşekkürler. –

+0

Eğer soru çalışmayı cevaplandı olarak işaretlerse;) NSObject'den miras alan – Fantattitude

3

Bu sorunun zaten kabul edilmiş bir cevabı olduğunu anlıyorum, ancak bu hatayı verecek başka bir durum buldum, böylece başka birine yardımcı olabilir. Swift 3. kullanıyorum.

Bir koleksiyon oluşturursanız ve türün türetilmesine izin verirseniz, bu hatayı da görebilirsiniz.

Örnek:

// 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 
] 
3

olası nedeni o equatable olduğunu ChecklistItem türünü söylemedim, belki ChecklistItem sınıf NSObject devralınan söylemeyi unutmuşum olduğunu.

import Foundation 

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

    func toggleChecked() { 
    checked = !checked 
    } 
} 

NSObject benimser veya Swift 4 ve Swift 3 yılında equatable protokol

+2

çöptür ve hızlıca kaçınılmalıdır. – Hogdotmac

2

uyan, senin Veri Modeli için "Equatable" protokolünü uygun ve sol eksen = rhs yöntemini uygulamak güncellemek, ancak o zaman "(of: ...) .Index" kullanabilirsiniz size özel nesne karşılaştırarak, çünkü

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

Kullanımı:

let index = self.photos.index(of: aPhoto) 
İlgili konular