В Swift 4.2 как написать func <() для сравнения 3 полей в классе? - PullRequest
0 голосов
/ 01 ноября 2018

Вот простой класс Swift с 3 полями:

public class Cabbage: Comparable {
    public let someString: String
    public let someInt: Int
    public let someDouble: Double

    public init(_ someString: String, _ someInt: Int, _ someDouble: Double) {
        self.someString = someString
        self.someInt = someInt
        self.someDouble = someDouble
    }

    public static func ==(lhs: Cabbage, rhs: Cabbage) -> Bool {
        if lhs.someString == rhs.someString {
            if lhs.someInt == rhs.someInt {
                if lhs.someDouble == rhs.someDouble {
                    return true
                }
            }
        }
        return false
    }

    public static func <(lhs: Cabbage, rhs: Cabbage) -> Bool {
        if lhs.someString < rhs.someString {
            if lhs.someInt < rhs.someInt {
                if lhs.someDouble < rhs.someDouble {
                    return true
                }
            }
        }
        return false
    }
}

Я думаю, что моя первая функция func == () верна. Мы возвращаем true тогда и только тогда, когда все поля равны.

Но я не думаю, что моя логика верна для func <(). </p>

Например, если lhs.someString == rhs.someString, должен ли я сравнивать lhs.someInt и rhs.someInt?

И если эти два равны, я должен также сравнивать lhs.someDouble и rhs.someDouble?

Любые идеи или рекомендации будут высоко оценены.

1 Ответ

0 голосов
/ 01 ноября 2018

Да, недостаточно просто проверить, является ли lhs.someString < rhs.someString. Вам также нужно определить, если lhs.someString > rhs.someString (или lhs.someString == rhs.someString).

Есть много способов написать это правильно. Вот один из них:

public static func <(lhs: Cabbage, rhs: Cabbage) -> Bool {
    if lhs.someString < rhs.someString { return true }
    if rhs.someString < lhs.someString { return false }
    if lhs.someInt < rhs.someInt { return true }
    if rhs.someInt < lhs.someInt { return false }
    return lhs.someDouble < rhs.someDouble
}
...