2015-11-10 1 views
0

Я пытаюсь проверить, содержит ли массив кортежей определенный набор, используя собственный метод Array. я объявил две мои «equatable» функции, какНевозможно создать правильную Equable функцию для использования с Array's .contains()

public func ==(a: (clip1: Clip?, clip2: Clip?), b: (clip1: Clip?, clip2: Clip?)) -> Bool { 

    let clipa1 = a.clip1 
    let clipa2 = a.clip2 
    let clipb1 = b.clip1 
    let clipb2 = b.clip2 

    if clipa1 != nil && clipa2 != nil && clipb1 != nil && clipb2 != nil { 
     return (clipa1! == clipb1!) && (clipa2! == clipb2!) 
    } 
    else if clipa1 != nil && clipa2 == nil && clipb1 != nil && clipb2 == nil { 
     return (clipa1! == clipb1!) 
    } else { 
     return false 
    } 
} 

public func ==(a: Clip, b: Clip) -> Bool { 
    return a.id == b.id 
} 

Однако, когда я пытаюсь это таким образом

for clip in tmp { 
       if !_filteredClips?.contains((clip1: clip.clip1, clip2: clip.clip2)) { 
        _filteredClips?.append(clip) 
       } 
      } 

я получаю Cannot convert value of type '(clip1: Optional<Clip>, clip2: Optional<Clip>)' to expected argument type '@noescape ((clip1: Clip?, clip2: Clip?)) throws -> Bool'

Что я здесь отсутствует?

ответ

0

Версия contains, которую вы пытаетесь использовать, является только для элементов, которые принимают Equatable: (? заколочек ?, клипов)

extension SequenceType where Generator.Element : Equatable { 
    /// Return `true` iff `element` is in `self`. 
    @warn_unused_result 
    public func contains(element: Self.Generator.Element) -> Bool 
} 

типа кортежа нет и вы не можете продлить его. Поскольку вы внедрили ==, вы можете использовать версию contains, которая берет предикат вроде этого.

for clip in tmp { 
    if !_filteredClips!.contains({ $0 == clip }) { 
     _filteredClips?.append(clip) 
    } 
} 

См. How do I check if an array of tuples contains a particular one in Swift? другие идеи.

-1

== Может использоваться для проверки равенства пользовательских типов, таких как структуры, классы и кортежи, как это делает абонент. Выбор между == и === зависит от того, нужен ли ваш код для проверки равенства или идентичности, а не от того, работаете ли вы с классом, структурой и т. Д.

+0

Извините, я не уверен, что понимаю, где я должен 'isEqual'. Позаботьтесь о том, чтобы уточнить немного больше, пожалуйста? – Thanos

+0

отредактировал ответ –

+0

Прошу прощения, это пока неясно. Не могли бы вы уточнить, как изменить код, который я вставил, чтобы избежать ошибки времени компиляции, которую я получаю? – Thanos

Смежные вопросы