如果 swift 2.0 中的 let nil 没有按预期工作

Posted

技术标签:

【中文标题】如果 swift 2.0 中的 let nil 没有按预期工作【英文标题】:if let nil in swift 2.0 is not working as expected 【发布时间】:2015-10-22 03:53:01 【问题描述】:

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

在下面的代码中,“fetchNumbersFromCoreDataDB”函数返回 nil。在 getDatabaseDate 函数中,我有一个条件“if let date = dbDate”。理想情况下,这种情况应该失败并转到 else 块。但在 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表中的NSDate类型

【问题讨论】:

所以是打印日期,还是崩溃? 【参考方案1】:

let dbDate 行的构造非常奇怪,如果您的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。

【讨论】:

以上是关于如果 swift 2.0 中的 let nil 没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2.0:读取 HealthKit 心率数据 - 在展开 Optional 时意外发现 nil

Swift 2.0:读取 HealthKit 心率数据 - 在展开 Optional 时意外发现 nil

Swift 2.0学习笔记(Day 6)——哎呀常量和变量都该什么时候用啊?

Swift 2.0 并发出警告

FacebookSDK(4.7) 自定义登录 UI 按钮 - Swift 2.0

Swift 中的 `let` 和 `var` 有啥区别?