在我的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创建协议。
谢谢!
答案 0 :(得分:2)
首先,我将告诉你如何做到这一点。然后,我会争辩说你可能不应该。
怎么做:
在整个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生命周期管理无关的属性的倾销场所。
相反,找到提取有凝聚力单位的方法。