[英]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.