如果 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