• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 05:22:19 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我使用的 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)?



Best Answer-推荐答案


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 能够通过快捷方式访问应用程序委托(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 但没有其他类。因此,您只需为需要访问应用程序委托(delegate)的每个 View Controller 执行此操作,而不是其他。与您最初提出的解决方案相反,我认为这是一个完全不必要的练习,但它确实解决了仅将代码注入(inject)某些类的问题。


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

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

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap