if语句忽略swift中的bool值

时间:2015-09-09 15:01:29

标签: ios swift

我必须做错事,因为在NSDictionary内,值为1或0且始终打印"locked" ...

let object: NSDictionary = self.collectionObjects?.objectAtIndex(indexPath.row) as! NSDictionary
if let locked = (object.objectForKey("locked") as? NSNumber)?.boolValue {
    println("locked")
} else {
    println("open")
}

5 个答案:

答案 0 :(得分:2)

你没有在那里测试任何东西

尝试,

ALTER TABLE dbo.Person ADD job_Id INT NULL;
ALTER TABLE dbo.Person WITH NOCHECK ADD CONSTRAINT FL_JOB 
FOREIGN KEY (job_Id) REFERENCES dbo.Job(job_Id);

答案 1 :(得分:2)

当你这样做时:

if let locked = (object.objectForKey("locked") as? NSNumber)?.boolValue {
    ...
} else {
    ...
}

if 语句正在检查您的locked变量是否已评估为nil值。如果它有一个值,那么将执行true语句块;如果它有nil,那么将执行false块(else语句)。

这称为Optional Binding

  

使用可选绑定来查明可选项是否包含   值,如果是,则使该值可用作临时常量   或变量。可选绑定可与if和while语句一起使用   检查可选内部的值,并提取该值   变成一个常数或变量,作为单一动作的一部分。

因此,如果您的变量未评估为nil,那么您可以使用locked块中的if变量。

例如:

if let locked = (object.objectForKey("locked") as? NSNumber)?.boolValue {
    if locked {
        println("locked")
    } else {
        println("open")
    }
} else {
    println("locked is nil")
}

有关示例,请参阅this SO post

答案 2 :(得分:1)

您正在做的是展开条件值,而不是检查它,所以您需要做的是:

  1. 打开它
  2. 测试
  3. 很简单,if-let-where语句可以在一行中为我们这样做:

    if let object = self.collectionObjects?.objectAtIndex(indexPath.row) as? NSDictionary, locked = object.objectForKey("locked")?.boolValue where locked {
        // we have a value here and it happens to be true
    } else {
        // this means we don't have a value
    }
    

    在if语句中也包含第一个let object - 您永远不会知道,它可能是null然后会意外崩溃。

    此外,编译器应该能够直接处理object -> boolValue,否则,添加NSNumber反馈。

答案 3 :(得分:1)

我推荐这个

let object: NSDictionary = self.collectionObjects?.objectAtIndex(indexPath.row) as! NSDictionary
if let locked = object.objectForKey("locked") as? NSNumber where locked.boolValue == true {
  print("locked")
}else {
  print("open")
}

答案 4 :(得分:1)

您只检查值是否为零。由于值不是零,因此您总是得到输出"锁定"。

试试这个

let object: NSDictionary = self.collectionObjects?.objectAtIndex(indexPath.row) as! NSDictionary 
if let locked = (object.objectForKey("locked") as? NSNumber)?.boolValue { 
    If locked == true {
        println("locked")
    }
    else { 
        println("open") 
    }
}