不同UIApplicationMain时引用appDelegate
Posted
技术标签:
【中文标题】不同UIApplicationMain时引用appDelegate【英文标题】:Reference to appDelegate when different UIApplicationMain 【发布时间】:2016-05-24 14:30:36 【问题描述】:在我的 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 创建协议。 谢谢!
【问题讨论】:
我从 2009 年开始从事 ios 应用程序开发,我从未在一个应用程序中看到两个不同的AppDelegates
。我认为你做错了什么。你想解决什么问题?
@dasdom,我总是使用 2 个 AppDelegate:qualitycoding.org/app-delegate-for-tests。 OP 面临的挑战是如何使用 Swift 严格的类型规则实现getAppDelegate
。
【参考方案1】:
首先,我将向您展示如何做到这一点。那么,我认为你可能不应该这样做。
怎么做:
整个 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 生命周期管理无关的属性的垃圾场。
相反,想办法提取内聚单元。
【讨论】:
以上是关于不同UIApplicationMain时引用appDelegate的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 调试器不再显示违规行,而是始终显示 UIApplicationMain
GSRegisterPurpleNamedPort SIGABRT 在 UIApplicationMain 在应用程序委托开始运行任何代码之前