gpt4 book ai didi

ios - swift 3 : If let statement crashes instead of executing else block

转载 作者:行者123 更新时间:2023-11-28 11:01:55 25 4
gpt4 key购买 nike

我想弄清楚 Swift 3 如何处理 if let 语法的展开。我的场景是我想在 if let 语句中从 CoreData 获取数据。我想解开那里的值(value),如果有一个值(value)(不是零),然后使用它。如果没有值,则执行 else block 中的内容。似乎有道理,但根据我的经验,这不是 Swift 3 的想法。

注意:没有要返回的“对象”实体。我希望它下拉以打印“No Objects”。

代码

// How I'm making the fetch from CoreData
class func getAllObjects() -> [Object]? {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest<Object>(entityName: "Object")
let fetched = try! context.fetch(fetchRequest)
return fetched
}

// Unwrapping value: How I'd do it... But Xcode didn't like...
if let fetchedObjects = WorkOrder.getAllObjects() as? [Order] {
self.objects = fetchedObjects
}
else {
print("No Objects")
}

// Unwrapping value: How Xcode "corrected" my code and this compiles
if let fetchedObjects = WorkOrder.getAllObjects()! as [Order]? {
self.objects = fetchedObjects
}
else {
print("No Objects")
}

会发生什么

应用程序崩溃。它在展开选项值时发现 nil。我认为 if let 应该防止我的应用程序崩溃。因为如果没有任何有效的解包它应该执行 else block 。对吧?

问题

您是否知道让 if let 以我上面建议的方式运行的方法?还是表现得像这样的代码?

最佳答案

如果没有对象,

WorkOrder.getAllObjects() 将返回一个空数组,而不是 nil。由于 getAllObjects 返回类型为 [Order] 的可选数组,因此您不需要向下转换,条件赋值就足够了。

如果您对条件赋值和 isEmpty 测试使用保护语句,您的代码会更简洁:

guard let fetchedObjects = WorkOrder.getAllObjects(), !fetchedObjects.isEmpty else {
print("No Objects")
return
}

print("There are \(fetchedObjects.count) work orders") // Note, no need to unwrap as the guard statement has already done this

使用try! getAllObjects 编写代码的方式永远不会返回nil;它要么返回一个(可能为空的)Order 数组,要么会崩溃。您应该将 getAllObjects 声明为 throws,或者如果出现问题至少返回 nil:

class func getAllObjects() -> [Object]? {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest<Object>(entityName: "Object")
var fetched: [Object]? = nil
do {
fetched = try context.fetch(fetchRequest)
}
catch() {
print("Error fetching work orders: \(error)")
}
return fetched
}

关于ios - swift 3 : If let statement crashes instead of executing else block,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40229496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com