如何解决如何在Swift 5中检查3个变量是否彼此相等?
我目前正在开发一个需要相互比较三个变量的应用程序。
比较规则:仅在以下情况下结果应为true: 所有三个变量都相等 OR 所有三个变量都不同
我的第一个想法是这样的,但我希望对此有一个更优雅的解决方案:
if (value1 == value2 && value2 == value3) || (value1 != value2 && value2 != value3 && value3 != value1) {
// True
} else {
// False
}
如果你们当中有人能想到一个更优雅的解决方案并与我分享,我将非常高兴。 感谢您的提前帮助!
解决方法
如果您的值也是package com.simple.Test;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
/**
*
* @author megaLinux
*/
public class User {
private StringProperty name = new SimpleStringProperty();
public String getName() {
return name.get();
}
public StringProperty nameProperty() {
return name;
}
public void setName(String name) {
this.name.set(name);
}
}
,则可以使用Hashable
。鉴于Set
会丢弃重复的值,您可以将检查简化为以下内容:
Set
,
一次过,还不错。
更“通用”的解决方案有点混乱,因为它需要跟踪2个不同的布尔变量,并正确处理空集合。
let valuesArray = [value1,value2,value3]
let valuesSet = Set(valuesArray)
if valuesSet.count == 1 || valuesSet.count == valuesArray.count {
// True
} else {
// False
}
如果此算法针对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,value3) = (1,2,3)
let result = [value1,value3].classifyElementEquality()
if result.allEqual || result.allUnequal {
print("They're either all equal,or all unequal")
} else {
print("Some of them are different")
}
的{{1}}实例,则可以简化一点,因为访问第一个元素比较容易,而无需手动管理迭代器。
Collection
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。