If statement 如果swift 2.0中的let nil未按预期工作
“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阻塞。我在这里感到困惑。这里有什么区别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() {
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指令。那么它是打印日期还是崩溃?