2015-04-29 2 views
13

звучит смешно, но я не могу не исправить этот кусок кода:не может ссылаться на «фильтр», со списком аргументов типа «((_) -> _)»

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

Независимо от того, как я написать замыкание Я всегда получаю эту ошибку:

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

runningScripts определяется следующим образом:

var runningScripts = [ScriptRunner]() 

и ScriptRunner - класс Swift (не наследуется от NSObject)

Я использую почти то же самое во многих других местах без проблем. Какие-либо предложения?

ответ

7

Вы можете получить эту ошибку, если вы не сделали ScriptRunner соответствовать 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

... или вы можете сделать это в подкласс NSObject (который соответствует «Equatable»). Обнаружил это именно в этот момент. В любом случае, благодарю Вас! (И на самом деле я хотел использовать '! ==' ...) – idmean

+1

Я был бы осторожен с этой техникой 'NSObject'. Это делает '==' более похожим на '===', если вы не переопределяете 'isEqual' чем-то более логичным (или реализуете' == 'себя, и в этом случае просто соответствовать' Equatable' проще). – Rob

+0

Спасибо за предупреждение. Я просто понял, что после написания комментария, поэтому я добавил «* И на самом деле я хотел использовать! == ... *» – idmean

1

мне нужен явный оттенок, как это:

@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!! 
     } 
    } 
Смежные вопросы