2015-10-20 2 views
9

Может кто-то дать мне хорошую причину, почему это не работает:Почему Equatable не определен для дополнительных массивов

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

Это было бы мое решение, предложенное (если безвкусный). Но это тривиально, поэтому я чувствую, что у меня нет веской причины, почему это не реализовано.

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

На самом деле дополнительное значение перечисления: 'enum OptionalValue {case None case Some (T)}', который может быть «None» или ваш тип, когда вы равны значению для необязательного массива, он возвращает тип case, который не равен. None thet return в случае второго erray, чем stial, нет типа. На самом деле это разные типы, когда вы делаете «a == b» –

ответ

16

Optionals можно сравнить только если основной завернутые тип equatable:

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

Теперь Массивы могут быть по сравнению если тип элемента equatable:

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

но даже для эквивалентных типов T, Array<T>не соответствует к протоколу Equatable.

В настоящее время это невозможно в Swift, см., Например, Why can't I make Array conform to Equatable? для обсуждения на форуме разработчиков Apple. Это изменение с реализацией из SE-0143 Conditional conformances в Swift 4.

Ваша реализация выглядит правильно, здесь можно разными один с помощью переключателя/случай с сопоставления с шаблоном:

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

А я вижу, я не понимал причины, по которым я мог это сделать раньше, с необязательным '' Array 'был только из-за объявления глобальной функции вместо расширение «Array» для соответствия «Equatable», где элементы «Equatable». Что вы думаете о моем предлагаемом решении и почему Apple не включила бы эту глобальную функцию? –

+1

@ScottH: см. Обновление. Я мог только предположить о вашем последнем вопросе, но если вы реализуете его для массивов, то что насчет словарей, множеств, последовательностей, ...? –

+0

Это много СУХОЙ, это действительная точка. Хотя это будет следовать той же схеме, что и Apple, с предоставлением '==' для необязательных массивов. Кажется, это лучший вариант, пока мы не сможем сделать что-то вроде 'extension CollectionType: Equatable где Element: Equatable {...}'. –

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