当前位置: 首页 > 知识库问答 >
问题:

比较可选的布尔变量不起作用

洪高阳
2023-03-14

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

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
    {...}

}
...

但在同一点上,(如果answ[Page][i]==true)抛出此错误:

二元运算符“==”不能应用于类型为“Bool?”的操作数。类型“(又名”可选。类型')和'布尔'”

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

无法将类型“Bool”的值分配给类型“Bool?”。类型'(又名'可选。类型')

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

我发现了这个主题:

检查可选布尔值的值

但这对我没有多大帮助。

共有3个答案

顾烨磊
2023-03-14

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

另外,请确保您符合Swift命名约定,即变量名的小写字母。

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
        }
    }
}

林星华
2023-03-14

您应该使用< code >提供回退值。?。

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

if Answ[Page][i] ?? false {
    [...]
}
公孙智
2023-03-14

您可以比较可选的布尔值,如Q中的

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

创建一个< code>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)
 类似资料:
  • 我有一个布尔方法正在对字符串进行一些错误检查。我有一个int类常量叫“numwords”=8。我将一个字符串传递给布尔方法,在该方法中,我使用.split和.length对字符串进行单词计数。一个名为“words”的int计算字符串中的单词数。完成之后,我要执行一个if语句,比较单词和数字单词。如果它们的数目相等,则返回true,否则为false。我试过==和.等于,但都没用。有什么想法吗? 我试

  • 为什么与有不同的 ? 我正在使用Drools DSL,我必须实现一个规则: 我有这些DSL定义: 要求是以肯定的方式编写可重用的DSL语句,并具有否定它们的能力。

  • 我有一个客户对象类,它有一些变量,并且已经实现了一个关于其中一个变量的比较器。然而,我需要为不同的变量last_name实现另一个比较器。 因为我的Customer类中不能有2个compareTo()方法,所以我决定在这里专门创建一个Comparing类 但一旦触及Collections.sort(客户); 它不会激活下面的公共int比较(Customer Customer_1,Customerc

  • 问题内容: 以这个为例(摘自Java regexchecker不起作用): 是否用于检查的值是否重要? 我知道有这是颇为相似。但是,很明显,这个问题只针对原始对象,而不是对象包装器;因此,将不适用。 另外,应该以不同于其他的方式对待? 问题答案: 从您的评论看来,您正在寻找使用包装器类的“最佳实践” 。但是实际上 并没有 最佳实践,因为使用此类开始是一个坏主意。使用对象包装的唯一原因是在您绝对 必

  • 我试图从SharedPreferences中获取布尔值,这是真的,但每次都会得到一个假值。名为“MyPref”的SharedPreferences文件包含以下代码: 我正在为MyActivity中的SharedPreferences添加值。使用以下代码初始化: 并通过以下方式在多个类上检索它: 我总是得到Premium的值为false,发生这种情况的原因是什么,如何解决?我使用的是android

  • 照例,每个类型的值都有一个相应类型的变量。C++中的布尔类型叫做bool。布尔变量的使用和其他类型类似,如: bool fred; fred = true; bool testResult = false; 第一行是一个简单的变量声明;第二行是个赋值;第三行是声明和赋值的组合,叫做初始化。 前面提到过,比较操作符的结果是布尔值,所以可以将结果保存在布尔变量中,如: bool evenFlag =