可以'向下转'到AppDelegate会失败吗?

时间:2017-05-24 08:50:13

标签: ios swift cocoa-touch

使用CoreData时,我们需要访问可通过AppDelegate获得的共享存储。要获得对AppDelegate的引用,我们可以通过执行以下操作来获取它:

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate 
else {
        return
    }

为什么在向Appdelegate投降时我们必须如此安全?由于某种原因,这种沮丧的人会失败吗?如果是这样,为什么呢?

我环顾四周,无法找到原因,为什么我们编写这段代码,并想知道为什么我写东西会有所帮助!

非常感谢你

3 个答案:

答案 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”类作为委托。因此,请务必小心。