我是编程新手,并试图找到一种更简单的方法:
if state[0] != 0 && state[1] != 0 && state[2] != 0 && state[3] != 0 && state[4] != 0 && state[5] != 0 && state[6] != 0 && state[7] != 0 && state[8] != 0 {
gameOverLabel.text = "It's a tie."
gameOverLabel.hidden = false
active = false
}
我尝试了下面的代码,但它的反应就像是OR而不是AND。
if state[0&1&2&3&4&5&6&7&8] != 0 {
gameOverLabel.text = "It's a tie."
gameOverLabel.hidden = false
active = false
}
感谢您的帮助!
答案 0 :(得分:2)
假设您的目的是检查所有数组元素 不同于零,最简单的方法是
if !state.contains(0) { ... }
您的代码
if state[0&1&2&3&4&5&6&7&8] != 0 { ... }
不起作用
按预期,因为这里是按位AND 0&1&2&3&4&5&6&7&8
首先计算(结果为零),因此等于
if state[0] != 0 { ... }
答案 1 :(得分:0)
let state = [0,1,2,0,4,5,6,7]
if state.filter{$0 != 0}.count > 0 {
gameOverLabel.text = "It's a tie."
gameOverLabel.hidden = false
active = false
}
试试这个
答案 2 :(得分:0)
Array
索引简短版
let indices = [4,2,9,6,5,3,8,0]
if !indices.contains({ state[$0] == 0 }) {
// ...
}
第二个版本只显示Swift的可能性:
if !indices.lazy.map{ state[$0] }.contains(0) {
// ...
}
使用lazy
,否则map
会将闭包应用于所有索引,而lazy
平均只应用一半元素(contains
确定数量处决关闭)。
注意:少量索引可能没有性能提升。第一个版本肯定(有点轻微)更快。
只需使用上面的方法
let indices = 5...9
或者直接操作Array
ArraySlice
的子序列。
旁注:尽管似乎ArraySlice
(返回类型Array[Range<Int>]
)是值类型,但在内部它是一种引用类型(如Array
})只在变异上复制自己。另外ArraySlice
只是数组的视图(因为它们都没有被突变)。所以它可能比第一种方法更快。
if !state[24...42].contains(0) {
// ...
}