不同的UIApplicationMain时引用appDelegate

时间:2016-05-24 14:30:36

标签: ios swift appdelegate xctest

在我的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创建协议。
谢谢!

1 个答案:

答案 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生命周期管理无关的属性的倾销场所。

相反,找到提取有凝聚力单位的方法。