[英]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.