2015-04-29 9 views
13

brzmi śmiesznie, ale jestem w stanie rozwiązać ten kawałek kodu:nie może powoływać „filtr” z listy argumentów typu „((_) -> _)”

self.runningScripts.filter({ $0 != scriptRunner }) 

Nieważne jak ja Napisać zamknięcie zawsze uzyskać ten błąd:

Cannot invoke 'filter' with an argument list of type ' ((_) -> _) '

runningScripts jest zdefiniowany następująco:

var runningScripts = [ScriptRunner]() 

i ScriptRunner to klasa Swift (nie dziedziczy po NSObject)

Używam prawie tego samego w wielu innych miejscach bez problemów. Jakieś sugestie?

Odpowiedz

7

Można uzyskać ten błąd, jeśli nie sprawiają ScriptRunner zgodne Equatable:

class ScriptRunner : Equatable { 
    // the rest of your implementation here 
} 

func ==(lhs: ScriptRunner, rhs: ScriptRunner) -> Bool { 
    return ... // change this to whatever test that satisfies that lhs and rhs are equal 
} 
+0

... czy można zrobić to podklasa NSObject (która jest zgodna z 'Equatable'). Odkryłem to właśnie w tej chwili. Mimo wszystko dziękuję! (I faktycznie chciałem użyć '! ==' ...) – idmean

+1

Byłbym ostrożny z tą techniką 'NSObject'. Sprawia, że ​​'==' zachowuje się bardziej jak '===', chyba że przesłonisz 'isEqual' z czymś bardziej logicznym (lub zaimplementuj' == 'siebie, w takim przypadku po prostu dostosowanie do' Równywalnego' jest prostsze). – Rob

+0

Dzięki za ostrzeżenie. Właśnie zdałem sobie sprawę, że po napisaniu komentarza, dlatego dodałem "* I faktycznie chciałem użyć! == ... *" – idmean

1

Potrzebowałem wyraźny obsady takiego:

@NSManaged private var storage: [String] 
    private var objects: Set<String>? 
    func remove(element:String) { 
     initSetIfNeeded() 
     if(objects!.contains(element)) { 
      objects!.remove(element) 
      storage = storage.filter({($0 as NSObject) !== (element as NSObject)}) // Explicit cast here!! 
     } 
    } 
Powiązane problemy