我可以在swift中支持多协议协议吗?

在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. } } 

我知道我在ViewController类中给test1和test2对象的地址。 所以“显示”被打印两次。 但是在这两个“协议”中我都能够这些方法的主体。

所以我的问题是,为什么苹果给我的function写在“协议”方法身体?

任何人都可以帮助我理解这个function?

虽然这个问题看起来很简单,解释了面向协议的编程的各个方面,重要性将使我写周围的整个博客:)

无论如何,面向协议的编程基本上可以让你利用多种inheritance,像JAVA这样的面向对象编程语言,Objective-C将不会支持,因为DiamondProblem

现在,虽然面向协议的编程允许您将function/functionbuild模为协议而不是类的实例方法(如Objective C的情况下),但我们必须同意我们都始终享有inheritance的function!!请记住,您曾经声明方法与一些操作,然后扩展它写任何具体的孩子,仍然使用父方法中的所有代码只需调用super.methodname ??? 现在你怎么可能在协议中实现它? 你不能重新使用代码?

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

例如:假设我有一个打印我的姓氏的协议,如果父类确认它会打印与我相同的姓氏,如果我确认同样的协议以及:)所有的家庭名称后,它将不会改变! !

仅仅因为你确认了协议,如果协议已经有了自己的默认实现,就不需要提供它的方法实现。 你会提供你自己的,如果你想做的事情提供的默认实现以外:)

 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() } } 

正如你可以看到我还没有提供任何实现test1或test2,但我使用它,如果它已经为我实施:)

那是默认执行协议的意图。 希望能帮助到你

观察:

你有两个协议,Test1和Test2都有相同的方法显示,现在你正在钻入DiamondProblem的基本问题,如果我简单地调用display()的实现来调用? Test1的或Test2的? Swift在编译时解决了这个问题,并告诉你当你调用self.display()的时候,使用display()

唯一的原因,它仍然工作可能在你的代码,因为你已经创build了两个types为test1和test2的variables,你已经调用方法使用test1.display()和test2.display()这是好的没有歧义那里,但那不是你想用它不是吗?

所以基本上,你永远不能进入钻石问题与协议:)