使用 Swift 协议和扩展覆盖对象方法

Posted

技术标签:

【中文标题】使用 Swift 协议和扩展覆盖对象方法【英文标题】:Override object method using Swift protocols and extensions 【发布时间】:2020-04-28 18:24:43 【问题描述】:

我想重写一个在框架中声明并在扩展中实现的方法。

这是我尝试过的:

import UIKit

// Code from a dependency

class Object  // UIViewController
    func printSomething() 
        print("something")
    


// My code

protocol SayHelloProtocol 
    func hello()
    func name() -> String


extension SayHelloProtocol 
    func hello() 
        print("Hello " + name())
    

    func name() -> String 
        "someone"
    


class MyHelloObject: Object, SayHelloProtocol 
    override func printSomething() 
        hello()
    


class MyHelloChildObject: MyHelloObject 
    func name() -> String 
        "You"
    


MyHelloObject().printSomething()
MyHelloChildObject().printSomething()

这将打印:

Hello someone
Hello someone

但我想重写该方法以便打印:

Hello someone
Hello You

是否可以覆盖在扩展中实现的方法?

【问题讨论】:

你有什么问题? @koen 我真的不知道如何重新措辞,但我希望MyHelloChildObject 覆盖协议中声明的名称函数SayHelloProtocol 【参考方案1】:

如果您将name() 函数也添加到MyHelloObject,它就会起作用:

class MyHelloObject: Object, SayHelloProtocol 
    override func printSomething() 
        hello()
    

    func name() -> String 
        "Someone"
    


class MyHelloChildObject: MyHelloObject 
    override func name() -> String 
        "You"
    

【讨论】:

感谢您的回答。即使这可行,它也不方便,因为它意味着将扩展中实现的方法复制粘贴到我的代码中。它复制代码并且不保证双方都会应用更改。我想找到更好的方法 @Xys 我认为这是不可能的。此页面可能有一些可能的解决方法:team.goodeggs.com/…

以上是关于使用 Swift 协议和扩展覆盖对象方法的主要内容,如果未能解决你的问题,请参考以下文章

swift Swift中协议和扩展的各种用途

Swift 学习笔记(面向协议编程)

iOS-swift-协议和拓展

swift 协议和扩展迅速

HTTP协议和HTTPS协议初探

python 迭代器协议和生成器!