2015-10-20 23 views
9

Czy ktoś może dać mi dobry powód, dlaczego to nie działa:Dlaczego Equatable nie zdefiniowane dla opcjonalnych tablic

let a: [Int]? = [1] 
let b: [Int]? = nil 
a == b 

Byłoby to rozwiązanie proponowane moje (jeśli nieeleganckie). Ale to trywialne, więc czuję, że brakuje mi dobrego powodu, dla którego nie jest to realizowane.

func ==<T: Equatable>(lhs: [T]?, rhs: [T]?) -> Bool { 

    if let lhs = lhs, let rhs = rhs { 
     return lhs == rhs 
    } 
    else if let _ = lhs { 
     return false 
    } 
    else if let _ = rhs { 
     return false 
    } 

    return true 
} 
+0

W rzeczywistości wartość opcja jest enum: "enum OptionalValue {case Brak przypadku Some (T)}", który może być "None" lub twój typ, gdy wartość jest równa opcjonalnej tablicy to zwraca typ przypadku, który nie jest równy Żaden thet powrót w przypadku drugiego erray niż stial mają bez typu. W rzeczywistości jest to inny typ, gdy robisz "a == b" –

Odpowiedz

16

opcjonalne mogą być porównywane tylko wtedy, gdy instrumentem bazowym owinięty typ jest equatable:

public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool 

Teraz Tablice mogą być porównaniu jeśli typ elementem jest equatable:

/// Returns true if these arrays contain the same elements. 
public func ==<Element : Equatable>(lhs: [Element], rhs: [Element]) -> Bool 

ale nawet dla typów równoważnych T, Array<T>nie spełnia do protokołu Equatable.

Obecnie nie jest to możliwe w witrynie Swift, zobacz na przykład Why can't I make Array conform to Equatable? dla dyskusji na forum programistów Apple. Ta zmiana z realizacją z SE-0143 Conditional conformances w Swift 4.

Implementacja wygląda poprawnie, tutaj jest możliwa inna za pomocą przełącznika/sprawy z pasującymi Wzór:

func ==<T: Equatable>(lhs: [T]?, rhs: [T]?) -> Bool { 

    switch (lhs, rhs) { 
    case let (l?, r?) : // shortcut for (.Some(l), .Some(r)) 
     return l == r 
    case (.None, .None): 
     return true 
    default: 
     return false 
    } 
} 
+0

Ah Widzę, nie zdawałem sobie sprawy, że powód, dla którego mogłem to zrobić wcześniej z nie-opcją 'Tablica 'był tylko z powodu globalnej deklaracji funkcji zamiast rozszerzenie 'Array', aby było zgodne z' Equatable', gdzie elementy są "Equatable". Co sądzisz o moim proponowanym rozwiązaniu i dlaczego Apple nie uwzględniłoby tej globalnej funkcji? –

+1

@ScottH: Zobacz aktualizację. Mogłem tylko spekulować na temat twojego ostatniego pytania, ale jeśli zaimplementujesz je dla tablic, to co ze słownikami, zestawami, sekwencjami ...? –

+0

To dużo SUCHEGO, to jest ważny punkt. Chociaż miałoby to taki sam wzór, jak Apple wybrał dostarczając '==' dla nie-opcjonalnych tablic. Wydaje się, że jest to najlepsza opcja, dopóki nie zrobimy czegoś takiego jak 'rozszerzenie CollectionType: Equatable where Element: Equatable {...}'. –

Powiązane problemy