gpt4 book ai didi

ios - 扩展 UIViewController 以访问应用委托(delegate)是一种反模式吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:20:19 24 4
gpt4 key购买 nike

我使用的 API 建议将其客户端保留在应用委托(delegate)中并通过那里访问它。如果我扩展 UIViewController 以使其更容易访问应用程序委托(delegate),这是否是一种反模式?

extension UIViewController {
var appDelegate: AppDelegate {
return UIApplication.shared.delegate as! AppDelegate
}
}

class SomeViewController: UIViewController {
...
appDelegate.someClient.someMethod()
...
}

我所说的反模式是指为了这种简单的便利而扩展整个 UIViewController 类是否有点矫枉过正?总体而言,像这样扩展类(class)是否有任何负面影响?现在是否每个 View Controller (即使它不访问 API)都隐式指向应用委托(delegate)?

最佳答案

If I extended UIViewController to make it easier to access the app delegate, is this any way an antipattern?

extension UIViewController {
var appDelegate: AppDelegate {
return UIApplication.shared.delegate as! AppDelegate
}
}

没有;恰恰相反。需要访问应用程序委托(delegate)并将其转换为实际类以便能够访问属性或调用应用程序委托(delegate)中的方法是很常见的。如果这可能需要在多个地方完成,计算属性是提供速记的标准符号。 (不需要为此目的使用扩展,但这样做没有坏处,而且可能有符号优势;例如,扩展可以位于应用程序委托(delegate)文件中。)


在评论中,您思考扩展 UIViewController 的智慧。我想你有两个 View Controller 需要访问应用程序委托(delegate),而许多其他 View Controller 则不需要。

现在,首先,这并没有真正改变我的答案。我看不出它会造成什么危害,或者它如何以任何方式成为一种反模式,让您的所有 View Controller 能够通过快捷方式访问应用程序委托(delegate),即使它们中的许多人实际上从未这样做过。所有 View Controller 都已经有能力做很多他们中的大多数人永远不会真正做的事情。

但假设您有不同的看法。然后你可以在每个相关的 View Controller 中显式地实现 appDelegate(以违反 DRY 为代价)。

或者(这是很酷的部分)您可以声明一个协议(protocol)和一个协议(protocol)扩展,并且只有相关的 View Controller 采用它。所以,这是你的 AppDelegate.swift 文件:

import UIKit

protocol AppDelegateAccesser {}
extension AppDelegateAccesser {
var appDelegate: AppDelegate {
return UIApplication.shared.delegate as! AppDelegate
}
}

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
// ....
}

现在假设实际上只有 MyViewController 类需要访问应用委托(delegate)。然后你就说

extension MyViewController : AppDelegateAccesser {}

这会将 appDelegate 注入(inject)到 MyViewController 中,但不会注入(inject)其他类。因此,您只需为每个需要访问应用程序委托(delegate)的 View Controller 执行此操作,而不是其他人。我认为这是一个完全没有必要的练习,与您最初提出的解决方案相反,但它确实解决了仅将代码注入(inject)某些类的问题。


注意:在 Swift 5 中,声明只有 UIViewController 子类可以采用此协议(protocol)是合法的。你可能会喜欢。

关于ios - 扩展 UIViewController 以访问应用委托(delegate)是一种反模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54540087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com