使用CoreData时,我们需要访问可通过AppDelegate获得的共享存储。要获得对AppDelegate的引用,我们可以通过执行以下操作来获取它:
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate
else {
return
}
为什么在向Appdelegate投降时我们必须如此安全?由于某种原因,这种沮丧的人会失败吗?如果是这样,为什么呢?
我环顾四周,无法找到原因,为什么我们编写这段代码,并想知道为什么我写东西会有所帮助!
非常感谢你
答案 0 :(得分:5)
向AppDelegate
(实际上是代表应用程序委托类的类)的可选向下转换将永远不会失败,因为如果应用程序委托类丢失,应用程序甚至无法启动。
你可以100%安全地写
let appDelegate = UIApplication.shared.delegate as! AppDelegate
许多人遭受惊悚恐惧症并且认为所有感叹号都是邪恶的,并且总是必须guard
任何可选项。这是错的。世界不仅是黑人和白人。在许多情况下强制展开可选项是安全的,就像在这种特殊情况下一样。
答案 1 :(得分:3)
将@UIApplicationMain
属性添加到类
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate { ... }
等效在“main.swift”中调用UIApplicationMain()
使用“AppDelegate”作为实例化应用程序委托的类的名称:
UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer<Int8>.self,
capacity: Int(CommandLine.argc)),
nil,
NSStringFromClass(AppDelegate.self)
)
(比较What does "@UIApplicationMain" mean?和Subclass UIApplication with Swift)。
使用任一方法,都会创建AppDelegate
类的实例
并作为委托传递给应用程序对象。是的,
let appDelegate = UIApplication.shared.delegate as! AppDelegate
是安全的。
但请注意,类名“AppDelegate”没有什么特别之处,这只是惯例。您可以定义应用程序 委托为
@UIApplicationMain
class MyFantasticAppDelegate: UIResponder, UIApplicationDelegate { ... }
在这种情况下,它当然是
let appDelegate = UIApplication.shared.delegate as! MyFantasticAppDelegate
所以准确的说法是
将
UIApplication.shared.delegate
转换为定义为应用程序委托的类的类型不会失败。
按照惯例,该类型为AppDelegate
,但不一定是。
答案 2 :(得分:1)
我不同意强制将向下转换到AppDelegate的向下转换永远不会失败的观点。不是真的因为“ AppDelegate”对于您的委托而言可能是错误的类型。例如,当应用程序使用RxAppState框架时,我遇到了它。它具有AppDelegate的扩展,该扩展返回“ RxAppState.RxApplicationDelegateProxy”类作为委托。因此,请务必小心。