2015-10-22 71 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。