2015-10-22 42 views
1

「如果讓nil」檢查不在Swift 2.0中工作,但在Swift 1.2中工作正常。如果讓nil在swift 2.0中沒有按預期工作

在下面的代碼中,「fetchNumbersFromCoreDataDB」函數返回nil。在getDatabaseDate函數中,我有一個條件「if let date = dbDate」。理想情況下,這種情況應該失敗,並去其他塊。但在Swift 2.0中,它將進入if塊。在Swift 1.2中,相同的代碼將會被其他塊阻塞。我很困惑。這裏有什麼不同?

func getDatabaseDate() { 
     let dbDate : NSDate? = ((self.fetchNumbersFromCoreDataDB(「123456」) as DBNumbers!).dbDate) 
     if let date = dbDate { 
      print(「\(date)」) 
     } 
     else { 
      print(「No Date」) 
     } 
    } 


func fetchNumbersFromCoreDataDB(Number:String) -> DBNumbers? { 
     var numArray = coreDataInterface.fetchAllObjectsFromEntity(info, withAttributeValues: [「No」 : Number]) as! [DBNumbers] 
     return numArray.count>0 ? numArray[0] : nil 
} 

注:「DBDATE」是Coredata表

+0

因此它打印日期或崩潰? – Wain

回答

1

let dbDate線很奇怪的構造NSDate的類型,如果你fetchNumbersFromCoreDataDB正在返回nil將引發異常。因此您的fetchNumbersFromCoreDataDB不返回nil

你行:

let dbDate : NSDate? = ((self.fetchNumbersFromCoreDataDB(「123456」) as DBNumbers!).dbDate) 

as DBNumbers!說轉換從DBNumbers?DBNumbers!。所以你有一個隱含解開的可選項。

因此.dbDate表示打開fetchNumbersFromCoreDataDB的返回結果並從中獲得dbDate屬性。如果fetchNumbersFromCoreDataDB返回nil,則解包的嘗試會引發異常。

什麼你可能想要的是:

let dbDate = self.fetchNumbersFromCoreDataDB(「123456」)?.dbDate 

它說:「如果可選fetchNumbersFromCoreDataDB返回不nil然後獲取其dbDate財產;否則得到nil」。

如果你真的需要經驗說服自己,打開一個遊樂場和嘗試這個辦法:

class DBNumbers { 
    var dbDate: NSDate? 
} 

func fetchNumbersFromCoreDataDB(Number:String) -> DBNumbers? { 
    return nil 
} 

let dbDate : NSDate? = (fetchNumbersFromCoreDataDB("123456") as DBNumbers!).dbDate 

你會得到最後一行的EXC_BAD_INSTRUCTION。