繁体   English   中英

不同的UIApplicationMain时引用appDelegate

[英]Reference to appDelegate when different UIApplicationMain

在我的main.swift文件中,我有2个不同的主要应用程序,分别用于测试和应用程序:

if NSClassFromString("XCTestCase") != nil {
    UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegateTesting))
} else {
    UIApplicationMain(Process.argc, Process.unsafeArgv, nil, NSStringFromClass(AppDelegate))
}

在应用程序中,我要访问AppDelegate:

extension UIApplication {
    static func getAppDelegate() -> AppDelegate {
        return UIApplication.sharedApplication().delegate as! AppDelegate
    }
}

因此,在执行XCTests时,它不起作用。 如何解决? 我不想重复代码。 可能模拟它或为UIApplication创建协议。
谢谢!

首先,我将向您展示如何做到这一点。 然后,我认为您可能不应该这样做。

怎么做:

整个Java使用接口来支持测试。 在Objective-C中,不需要协议来替代不同的实现。 但是在Swift中,协议是支持同一接口的多种实现(测试和生产)的方式。

protocol AppDelegateProtocol {
    // whatever you need
}

extension UIApplication {
    static func getAppDelegate() -> AppDelegateProtocol {
        return UIApplication.sharedApplication().delegate as! AppDelegateProtocol
    }
}

当然,AppDelegate和AppDelegateTesting都必须符合AppDelegateProtocol。

为什么您可能不应该这样做:

应用程序委托的目的是提供控制应用程序生命周期的方法。

您为什么想要方便的方法来访问应用程序委托? 我猜您正在将它用作单例,这是存储应用程序范围属性的便捷位置。 别。 查看每个属性,然后决定要使用的属性。 有些可能属于同一个人。 但是以我的经验,AppDelegate成为与UIApplication生命周期管理无关的属性的垃圾场。

取而代之的是,找到提取内聚单元的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM