比较可选的Bool变量不起作用

时间:2017-09-15 09:58:52

标签: arrays swift boolean optional

我必须创建一个可选Array类型的2D Bool并比较其中的值,但我不能。 我第一次尝试以这种方式宣布:

var Answ = [[Bool?]] ()
var Page = 0 

for i in 0...4
{
    if Answ[Page][i] ==  true
    {...}

    else if Answ[Page][I] == false
    {...}

    else
    {...}

}
...

但是当我启动该程序时,它说:

  

指数超出范围

当Xcode将Answ[Page][i]与值true进行比较时。

所以,我尝试修改代码并以这种方式声明数组:

var Answ = Array (repeating: Array (repeating: Bool?.self , count: 5), count: 40)
var Page = 0 

for i in 0...4
{
    if Answ[Page][i] ==  true
    {...}

    else if Answ[Page][I] == false
    {...}

    else
    {...}

}
...

但同时,(if Answ[Page][i] == true)会抛出此错误:

  

二元运算符'=='不能应用于'Bool?.Type'类型的操作数(又名'optional.Type')和'Bool'“

此外,在我尝试将数组的值设置为true / false(Answ[Page][2] = true)的代码的其他位置,Xcode说:

  

无法指定'Bool'类型的值来输入'Bool?.Type'(Aka'Optional.Type')

有人可以帮帮我吗?提前谢谢。

我找到了这个话题:

Checking the value of an Optional Bool

但它对我帮助不大。

3 个答案:

答案 0 :(得分:1)

可以比较您链接到的Q& A中的可选bool。问题是

var Answ = Array (repeating: Array (repeating: Bool?.self , count: 5), count: 40)

创建一个Bool?.self的(嵌套)数组,它是可选bool的类型,而不是该类型的

你想要的是Bool? 值的(嵌套)数组,初始化为nil

var answers: [[Bool?]] = Array(repeating: Array(repeating: nil , count: 5), count: 40)

或者:

var answers = Array(repeating: Array(repeating: Bool?.none , count: 5), count: 40)

答案 1 :(得分:0)

您应该使用??提供后备值

顺便说一句,您不需要写== false== true,这是多余的。

if Answ[Page][i] ?? false {
    [...]
}

答案 2 :(得分:0)

您的代码存在一些问题。首先,不要在for循环中使用手动索引,而是使用for ... in自动为您处理索引。其次,处理可选布尔值的更好解决方案是使用可选绑定安全地解包值,然后检查非可选值。您也不需要写if bool == trueif bool具有相同的含义。

另外请确保符合Swift命名约定,这是变量名称的较低camelCase。

var answ = [[Bool?]] ()
var page = 0

for ans in answ[page]{
    if let unwrappedAns = ans {
        if unwrappedAns {
            // answ[page][i] = true
        } else {

        }
    } else {
        //answ[page][i] = ans is nil
    }
}

如果你真的想要遍历整个数组,这是一种安全的方法:

for page in answ {
    for ans in page {
        //here ans = Answ[Page][i] when compared to the code in your question
        if let unwrappedAns = ans {
            if unwrappedAns {

            } else {

            }
        } else {
            //ans is nil
        }
    }
}