可以动态地将逻辑附加到方法上吗?

杜鲁门1

我想将一个类的闭包动态附加到另一个方法上。例如,因为UIViewController我想添加扩展名,以便可以在viewDidLoad事件中插入代码我尝试了类似下面的操作,但是不起作用:

class BaseViewController: UIViewController, MyProtocol {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        // Setup and bind
        configure()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Call MyProtocol.myDidLoad but not explicitly!
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        // Call viewWillAppear but not explicitly!
    }

}

protocol MyProtocol { }

extension MyProtocol where Self: UIViewController {

    func configure() {
        // Something like below isn't possible???
        self.viewDidLoad += myDidLoad
        self.viewWillAppear += myWillAppear
    }

    func myDidLoad() {
        // Something
    }

    func myWillAppear() {
        // Something
    }
}

无需从中显式调用协议功能,是否可以实现这一点UIViewController我不想遍历所有类并为每个函数调用协议函数。那将是乏味的,冗余的代码,并且很容易被忽略。有没有更优雅的方式?

更新:

下面是我可以考虑到的限制的唯一方法,但是它使用的是对结构的继承,并且仍然需要我显式调用协议扩展功能,这不是我想要做的:

class FirstViewController: BaseViewController {

}

class BaseViewController: UIViewController, MyProtocol, MyProtocol2, MyProtocol3 {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        // Configure protocols
        configure(self as MyProtocol)
        configure(self as MyProtocol2)
        configure(self as MyProtocol3)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Load protocols
        viewDidLoad(self as MyProtocol)
        viewDidLoad(self as MyProtocol2)
        viewDidLoad(self as MyProtocol3)
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        // Prerender protocols
        viewWillAppear(self as MyProtocol)
        viewWillAppear(self as MyProtocol2)
        viewWillAppear(self as MyProtocol3)
    }

}

protocol MyProtocol { }

extension MyProtocol where Self: UIViewController {

    func configure(delegate: MyProtocol) {
        print("MyProtocol.configure")
    }

    func viewDidLoad(delegate: MyProtocol) {
        print("MyProtocol.viewDidLoad")
    }

    func viewWillAppear(delegate: MyProtocol) {
        print("MyProtocol.viewWillAppear")
    }
}

protocol MyProtocol2 { }

extension MyProtocol2 where Self: UIViewController {

    func configure(delegate: MyProtocol2) {
        print("MyProtocol2.configure")
    }

    func viewDidLoad(delegate: MyProtocol2) {
        print("MyProtocol2.viewDidLoad")
    }

    func viewWillAppear(delegate: MyProtocol2) {
        print("MyProtocol2.viewWillAppear")
    }
}

protocol MyProtocol3 { }

extension MyProtocol3 where Self: UIViewController {

    func configure(delegate: MyProtocol3) {
        print("MyProtocol3.configure")
    }

    func viewDidLoad(delegate: MyProtocol3) {
        print("MyProtocol3.viewDidLoad")
    }

    func viewWillAppear(delegate: MyProtocol3) {
        print("MyProtocol3.viewWillAppear")
    }
}

//Output:
//MyProtocol.configure
//MyProtocol2.configure
//MyProtocol3.configure
//MyProtocol.viewDidLoad
//MyProtocol2.viewDidLoad
//MyProtocol3.viewDidLoad
//MyProtocol.viewWillAppear
//MyProtocol2.viewWillAppear
//MyProtocol3.viewWillAppear

这破坏了面向协议编程的全部目的。在iOS开发范围内工作时,Swift是否可以处理一种优雅的方法,或者POP在这种情况下不起作用?

Paulw11

Swift和Objective-C都是单继承语言,因此您无法做任何事情。

扩展只能添加其他方法,不能覆盖方法。只有子类可以覆盖现有类中的方法。考虑多个扩展覆盖相同方法的情况-应该调用哪个方法?所有这些?如果是的话,按什么顺序?钻石问题

最简单的方法是创建提供所需功能的UIViewController子类。尽管程序员可以创建一个符合协议但不对正确的超类进行子类化的类,但考虑到该类和协议是在同一行输入的,这将是一个非常愚蠢的错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何动态地将大块HTML附加到div?

来自分类Dev

AngularJS:有没有一种方法可以在标签元素上创建双向绑定,以便我可以将其动态地附加到对象上?

来自分类Dev

可以动态地将部分添加到Matlab发布脚本吗?

来自分类Dev

是否可以从Java动态地将方法添加到Groovy基本脚本中?

来自分类Dev

您可以动态地将匿名方法(函数)转换为命名方法吗?

来自分类Dev

根据同级兄弟上一类动态地将addClass()添加到元素吗?

来自分类Dev

如何动态地将事件处理程序附加到SVG组?

来自分类Dev

如何动态地将<span>标记附加到<p>标记的特定位置?

来自分类Dev

如何动态地将事件处理程序附加到SVG组?

来自分类Dev

动态地将一个 div 附加到另一个 div

来自分类Dev

如何动态地将多个条件附加到 Laravel 查询?

来自分类Dev

注释可以附加到方法上吗

来自分类Dev

在 R 中动态地将一个数据帧附加到另一个数据帧上

来自分类Dev

张量流可以在训练中动态地将文件添加到FIFOQueue中

来自分类Dev

有聪明的方法可以动态地调用类型相关的扩展方法吗?

来自分类Dev

我们可以动态地将值传递给Spring bean定义的参数吗?

来自分类Dev

我可以动态地将文本块中的部分文本加粗吗?

来自分类Dev

有什么方法可以使用Java动态地在zip文件中创建zip吗?

来自分类Dev

有什么方法可以使用Java动态地在zip文件中创建zip吗?

来自分类Dev

在Meteor中,如何将应用程序的根URL动态地附加到图像路径?

来自分类Dev

如何使用Selenium JavascriptExecutor在运行时动态地将“输入标签”附加到DOM中?

来自分类Dev

您可以动态地向对象添加属性吗?

来自分类Dev

如何动态地将Image添加到ImageView?

来自分类Dev

动态地将超链接添加到gridview

来自分类Dev

动态地将数据添加到QTableView

来自分类Dev

动态地将视图添加到布局

来自分类Dev

动态地将标签添加到JTabbedPane

来自分类Dev

动态地将属性添加到类

来自分类Dev

动态地将内容添加到标签页

Related 相关文章

  1. 1

    如何动态地将大块HTML附加到div?

  2. 2

    AngularJS:有没有一种方法可以在标签元素上创建双向绑定,以便我可以将其动态地附加到对象上?

  3. 3

    可以动态地将部分添加到Matlab发布脚本吗?

  4. 4

    是否可以从Java动态地将方法添加到Groovy基本脚本中?

  5. 5

    您可以动态地将匿名方法(函数)转换为命名方法吗?

  6. 6

    根据同级兄弟上一类动态地将addClass()添加到元素吗?

  7. 7

    如何动态地将事件处理程序附加到SVG组?

  8. 8

    如何动态地将<span>标记附加到<p>标记的特定位置?

  9. 9

    如何动态地将事件处理程序附加到SVG组?

  10. 10

    动态地将一个 div 附加到另一个 div

  11. 11

    如何动态地将多个条件附加到 Laravel 查询?

  12. 12

    注释可以附加到方法上吗

  13. 13

    在 R 中动态地将一个数据帧附加到另一个数据帧上

  14. 14

    张量流可以在训练中动态地将文件添加到FIFOQueue中

  15. 15

    有聪明的方法可以动态地调用类型相关的扩展方法吗?

  16. 16

    我们可以动态地将值传递给Spring bean定义的参数吗?

  17. 17

    我可以动态地将文本块中的部分文本加粗吗?

  18. 18

    有什么方法可以使用Java动态地在zip文件中创建zip吗?

  19. 19

    有什么方法可以使用Java动态地在zip文件中创建zip吗?

  20. 20

    在Meteor中,如何将应用程序的根URL动态地附加到图像路径?

  21. 21

    如何使用Selenium JavascriptExecutor在运行时动态地将“输入标签”附加到DOM中?

  22. 22

    您可以动态地向对象添加属性吗?

  23. 23

    如何动态地将Image添加到ImageView?

  24. 24

    动态地将超链接添加到gridview

  25. 25

    动态地将数据添加到QTableView

  26. 26

    动态地将视图添加到布局

  27. 27

    动态地将标签添加到JTabbedPane

  28. 28

    动态地将属性添加到类

  29. 29

    动态地将内容添加到标签页

热门标签

归档