我可以在swift中使用协议支持多重继承吗?

vik*_*ati 5 protocols ios swift swift3

在Swift中,通过使用扩展,您可以在"协议"中提供方法体.在我的代码中,我能够给出方法体,参见

protocol Test1{
    func display()
}
extension Test1{

    func display(){
        print("display Test1")
    }
}

protocol Test2{
    func display()
}
extension Test2{

    func display(){
        print("display Test2")
    }
}
class ViewController: UIViewController,Test1,Test2 {

    var test1 : Test1?
    var test2 : Test2?

    func display() {
        print("display")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.test1 = self
        test1?.display()

        self.test2 = self
        test2?.display()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我在ViewController类中提供了test1和test2对象的地址.所以"显示"被打印两次.但在"协议"中,我能够使用这些方法.

所以我的问题是为什么苹果给我功能在"协议"中编写方法体?

任何人都可以帮我理解这个功能吗?

San*_*ari 7

虽然这个问题看起来很简单,但解释了面向协议编程的所有方面,并且out的重要性将让我围绕它编写完整的博客:)

无论如何,面向协议编程基本上使你能够利用多重继承,因为DiamondProblem,像JAVA,Objective-C这样的面向对象编程语言不会支持

现在虽然面向协议编程允许您将功能/功能建模为协议而不是类的实例方法(如在目标C的情况下),但我们必须同意我们总是喜欢继承!!,记住您曾经声明过一些操作的方法,然后扩展它写任何特定于子的东西,仍然使用父方法中的所有代码简单地通过调用super.methodname ??? 现在你怎么可能在协议中实现它?你不能重新使用代码?

所以Protocols默认实现是向类提供默认实现的简单方法,它只是想扩展和确认协议,但不打算修改它.

示例:假设我有一个打印我的姓氏的协议,如果父类确认它,如果我同样确认相同的协议,它将打印与我相同的姓氏:)更正其姓氏之后它不会改变! !

仅仅因为您确认协议,如果协议已经有自己的默认实现,则无需提供其方法实现.如果您想要执行除提供的默认实现之外的其他操作,您将提供自己的:)

protocol Test {
    func test1()
}

extension Test {
    func test1() {
        print("Yo man")
    }
}

protocol Test2 {
    func test2()
}

extension Test2 {
    func test2() {
        print("Bye man")
    }
}

class ViewController: UIViewController,Test,Test2 {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.test1()
        self.test2()
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我没有为test1或test2提供任何实现,但我使用它就好像它已经为我实现了:)

这是默认实施协议的意图.希望能帮助到你

观察:

你有两个协议,Test1和Test2都有相同的方法显示,现在你进入DiamondProblem的基本问题,如果我只是调用display()调用哪个实现?Test1或Test2's ?? Swift在编译时解决它并告诉你在调用self.display()时模糊地使用display()

它仍然可以在你的代码中工作的唯一原因,因为你已经创建了两个类型为test1和test2的变量,并且你使用test1.display()和test2.display()调用了方法,这没有任何歧义,但那不是你怎么样的想用它不是吗?

所以基本上你永远不会陷入与协议的钻石问题:)