簡體   English   中英

如何在 Swift 5 中檢查 3 個變量是否相等?

[英]How to Check if 3 Variables are equal or not equal to each other in Swift 5?

我目前正在開發一個需要相互比較三個變量的應用程序。

比較規則:結果應該只在以下情況下為真:所有三個變量都相等三個變量都不同

我的第一個想法是這樣的,但我希望有一個更優雅的解決方案:

if (value1 == value2 && value2 == value3) || (value1 != value2 && value2 != value3 && value3 != value1) {
    // True
} else {
    // False
}

如果你們中有人能想到更優雅的解決方案並與我分享,我會非常高興。 提前感謝您的幫助!

如果您的值也是Hashable您可以使用Set 鑒於Set丟棄重復值的事實,您可以將檢查簡化為如下所示:

let valuesArray = [value1, value2, value3]
let valuesSet = Set(valuesArray)

if valuesSet.count == 1 || valuesSet.count == valuesArray.count {
    // True
} else {
    // False
}

對於一次性,這還不錯。

更“通用”的解決方案有點混亂,因為它需要跟蹤 2 個不同的布爾變量,並正確處理空集合。

extension Sequence where Element: Equatable {
    func classifyElementEquality() -> (allEqual: Bool, allUnequal: Bool) {
        var iterator = self.makeIterator()
        
        guard let first = iterator.next() else {
            return (true, true) // all empty
        }
        
        return AnyIterator(iterator)
            .reduce(into: (allEqual: true, allUnequal: true)) { acc, element in
                if first == element {
                    acc.allUnequal = false
                } else {
                    acc.allEqual = false
                }
            }
    }
}

let (value1, value2, value3) = (1, 2, 3)
let result = [value1, value2, value3].classifyElementEquality()

if result.allEqual || result.allUnequal {
    print("They're either all equal, or all unequal")
} else {
    print("Some of them are different")
}

如果此算法針對Collection不是Sequence ,它會變得更簡單一些,因為訪問第一個元素更容易,而無需手動管理迭代器。

extension Collection where Element: Equatable {
    func classifyElementEquality() -> (allEqual: Bool, allUnequal: Bool) {
        guard let first = self.first else {
            return (true, true) // all empty
        }
        
        return self
            .dropFirst()
            .reduce(into: (allEqual: true, allUnequal: true)) { acc, element in
                if first == element {
                    acc.allUnequal = false
                } else {
                    acc.allEqual = false
                }
            }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM