【问题标题】:Compare Optional Bool variable doesn't work比较可选布尔变量不起作用
【发布时间】:2018-02-24 11:40:35
【问题描述】:

我必须创建一个可选Bool 类型的二维Array 并比较其中的值,但我不能。 第一次尝试这样声明:

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'类型的操作数"

此外,在我尝试将数组的值设置为真/假 (Answ[Page][2] = true) 的代码的其他点中,Xcode 表示:

无法将类型“Bool”的值分配给类型“Bool?.Type”(又名“Optional.Type”)

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

我找到了这个话题:

Checking the value of an Optional Bool

但这对我没有多大帮助。

【问题讨论】:

标签: arrays swift boolean optional


【解决方案1】:

可以比较您链接到的问答中的可选布尔值。问题是

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

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

你想要的是一个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)

【讨论】:

  • 谢谢,现在代码可以运行了。如果我能回报我的话;)
【解决方案2】:

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

对了,== false或者== true不用写了,是多余的。

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

【讨论】:

    【解决方案3】:

    您的代码存在几个问题。首先,不要在 for 循环中使用手动索引,而是使用 for ... in 自动为您处理索引。其次,处理可选布尔值的更好解决方案是使用可选绑定安全地展开值,然后检查非可选值。你也不需要写if bool == trueif 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
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2018-02-01
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多