Sort array according to boolean property
我有一个对象数组。每个对象都有一个属性isUser: Bool。因此,现在我要对该数组进行排序,以使带有isUser == true的对象首先出现在数组中,然后是带有isUser == false的对象。
我是否需要同时过滤true和false,然后将两个数组连接起来,还是可以更简单地完成呢?
您可以扩展Bool以使其具有可比性:对待true == 1和false == 0。好处是您的代码变得更容易阅读:
1 2 3 4 5 6 7
| extension Bool: Comparable {}
public func < (lhs: Bool, rhs: Bool) -> Bool {
return Int(lhs) < Int(rhs)
}
self.objectsOfFoo.sortInPlace { $0.isUser > $1.isUser } |
- 疯狂在其中。由于各种原因,在C语言和其他语言中使用整数作为true和false值会导致许多问题。一个很大的问题是,假小于真的概念是一个任意决定,对布尔值没有任何实际影响。最好的处理方法是使用现有的逻辑运算符测试true或false。制作Bool Comparable是不必要的且令人困惑的hack。
-
自从原始C语言以来已经有40年了,这并不令人困惑
-
C等中的主要错误。 al。已发现其原因是比较整数而不是布尔值。在您的示例中,这种可能性较小,但仍然是避免不必要的运算符重载的良好编码实践。尤其是当对与错的概念并不真正适合于自然的"小于"运算符时。有布尔运算符可以很好地处理任务,请改用这些运算符。
-
请引用。否则,这是一个稻草人的论点。顺便说一句,C直到C99才有bool。直到今天,true和false仍映射为1和0。任何值得在其上打印纸的C书都将提到这一点。在这种情况下,问题是给布尔值一个命令。这正是我所做的。我发现这场辩论毫无争议
-
有很多:markshroyer.com/2012/06/c-both-true-and-falsestackoverflow.com/questions/1934580/…bignerdranch.com/blog/bools-sharp-corners andromeda.com/people/ddyer/topten .html-尽管您所执行的操作都不是完全正确的,但如果可以的话,最好避免使用它。
-
这些不是生产软件中的错误,而是边缘情况。如果您想用脚射击自己,C会提供足够的弹药。这场辩论越来越愚蠢。我们只是同意不同意
我自己解决了。可能存在以下情况:
1
| self.objectsOfFoo.sortInPlace { $0.isUser && !$1.isUser} |
sorted()将基于bool属性返回排序后的数组,而不会更改内容。
1
| let sortedArray = unsortedArray.sorted(by:{ !$0.isUser && $1.isUser}) |
您可以在Swift 3.0中对Array进行排序,如下所示。我尝试使用Swift 3.0
中的Bool属性
1 2 3 4 5 6 7 8 9 10 11
| yourArray.sort { (item1, item2) -> Bool in
var check1: Int = 0
var check2: Int = 0
if item1.isUser != nil, item1.isUser == true {
check1 = 1
}
if item2.isUser != nil, item2.isUser == true {
check2 = 1
}
return check1 > check2
} |