If statement 如果swift 2.0中的let nil未按预期工作

If statement 如果swift 2.0中的let nil未按预期工作,if-statement,core-data,nsdate,swift2,xcode7,If Statement,Core Data,Nsdate,Swift2,Xcode7,“if let nil”检查在Swift 2.0中不起作用,但在Swift 1.2中效果良好 在下面的代码中,“fetchNumbersFromCoreDataDB”函数返回nil。在getDatabaseDate函数中,我有一个条件“if let date=dbDate”。理想情况下,此条件应失败并转到else块。但在Swift 2.0中,它将进入if块。在Swift 1.2中,相同的代码将被else阻塞。我在这里感到困惑。这里有什么区别 func getDatabaseDate() {

“if let nil”检查在Swift 2.0中不起作用,但在Swift 1.2中效果良好

在下面的代码中,“fetchNumbersFromCoreDataDB”函数返回nil。在getDatabaseDate函数中,我有一个条件“if let date=dbDate”。理想情况下,此条件应失败并转到else块。但在Swift 2.0中,它将进入if块。在Swift 1.2中,相同的代码将被else阻塞。我在这里感到困惑。这里有什么区别

 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表中的NSDate类型,
let dbDate
行的构造非常奇怪,如果您的
从CoreDataDB
获取的数字返回
为nil
,则会引发异常。因此,您的
fetchNumbersFromCoreDataDB
不会返回
nil

您的线路:

let dbDate : NSDate? = ((self.fetchNumbersFromCoreDataDB(“123456”) as DBNumbers!).dbDate)
作为dbnumber
表示从
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\u BAD\u指令。

那么它是打印日期还是崩溃?