2014-09-15 2 views
1

Я размышлял над этим утром о том, как правильно реализовать операторов сравнения в Swift. У меня есть класс (очень легкий класс дата), для которого я перегруженный оператор равенства:Предоставление минимальных реализаций для перегруженных операторов сравнения в Swift

func == (lhs: SimpleDate, rhs: SimpleDate) -> Bool { 
    if (lhs.day != rhs.day) { 
     return false 
    } 
    if (lhs.month != rhs.month) { 
     return false 
    } 
    if (lhs.year != rhs.year) { 
     return false 
    } 
    return true 
} 

Но теперь я также хотел бы иметь возможность использовать >, <, >= и <=. Когда дело доходит до предоставления этой функции, нужно ли писать все 4 функции?

Отсюда следует, что для >= вы могли бы опираться на уже создаваемом комбинации == || >, но мне было интересно, есть ли способ для этого функциональность будет автоматически определяться Swift, если он видит, что == и > оба были реализованы ,

ie. есть способ, вместо того, чтобы писать эти 5 функций с глобальным охватом в моем классе, переопределить специальную функцию/оператор, который позволяет мне возвращать NSComparisonResult или аналогичный, и пусть Swift автоматически перегрузит все эти операторы для меня?

ответ

4

Ответ дается в "Swift Standard Library Reference":

Equatable

Equatable протокол позволяет определить, являются ли два значения одного и того же типа, считаются равными.

Существует одна требуемая перегрузка оператора, определенная в протоколе: ==.

Comparable

сопоставимом протокол позволяет сравнить два значения одного и того же типа.

Существует одна требуемая перегрузка оператора, определенная в протоколе (<), , а также одна, определенная в унаследованном Equatable протоколе (==). В соответствии с , используя протокол Comparable и добавляя перегрузку оператора для <, вы автоматически получаете возможность использовать>, < =, и> =.

Так что достаточно, чтобы ваш класс соответствует Comparable, и == и < операторы реализуются:

class SimpleDate : Comparable { 
    // ... 
} 

func == (lhs: SimpleDate, rhs: SimpleDate) -> Bool { 
    // ... 
} 

func < (lhs: SimpleDate, rhs: SimpleDate) -> Bool { 
    // ... 
} 

Остальные операторы сравнения !=, >, <= и >= затем предоставляются по общие методы библиотеки.

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