我必须做错事,因为在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")
}
答案 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)
您正在做的是展开条件值,而不是检查它,所以您需要做的是:
很简单,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")
}
}