簡體   English   中英

if語句迅速忽略布爾值

[英]if statement ignores bool value in 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")
}

你在那里沒有測試任何東西

嘗試,

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

在執行操作時:

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

if語句正在檢查您的locked變量是否已評估為nil值。 如果它有一個值,那么將執行true語句塊;否則,將執行true 如果它為nil則將執行false塊(其他語句)。

這稱為Optional Binding

您可以使用可選綁定來確定可選對象是否包含值,如果包含,則使該值可用作臨時常量或變量。 可選綁定可以與if和while語句一起使用,以檢查可選內部的值,並將該值提取到常量或變量中,作為單個操作的一部分。

結果,如果您的變量未求值為nil則可以在if塊內使用locked變量。

例如:

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

有關示例,請參見此SO帖子

您正在做的是展開條件值,而不是檢查條件值,因此您需要做的是:

  1. 解開它
  2. 測試一下

方便地,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強制回退。

我推薦這個

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

您僅在檢查值是否為nil。 由於該值不為nil,因此您始終將輸出鎖定為“鎖定”。

嘗試這個

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM