在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对象的地址。因此,"显示"打印了两次。但是在两个"协议"中,我都可以构成这些方法。
所以我的问题是,为什么苹果给我功能以在"协议"中编写方法主体?
任何人都可以帮助我理解此功能吗?
,尽管该问题看起来很简单,解释了以协议为导向的编程和重要性的所有方面,这会让我围绕它写整个博客:)
无论如何,以协议为导向的编程基本上使您能够利用多个继承,以对象为导向的编程语言(例如Java),Objective-C不支持Diamondproblem
现在尽管以协议为导向的编程使您可以建模功能/功能作为协议,而不是作为类实例方法(如目标c),我们必须同意,我们都始终享受继承!对孩子,仅通过调用super.methodname ???现在,您如何在协议中实现它???您无法重新使用代码??
因此,协议默认实现是向类提供默认实现的简单方法,这些方法只是想扩展和确认协议,但不费心修改。
示例:假设我有一个协议打印我的姓氏,如果父母班级确认它,它将与我打印与我相同的姓T更改!!!
仅仅因为您确认协议,您不需要提供其方法实现,如果该协议已经具有自己的默认实现。如果您想执行除默认实现以外的其他操作:)
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都具有相同的方法显示,现在您正在介绍钻石问题的基本问题,如果我简单地调用display()要拨打哪个实现?test1或test2的?Swift在编译时解决了它,并告诉您call self.display()
时,thembigiud使用display()它仍然可能在UR代码中工作的唯一原因,因为您已经创建了两个类型test1和test2的变量,并且使用test1.display()和test2.display()调用了方法,这是没有歧义的,但是那是不是您想如何使用它吗?
因此,基本上您永远无法使用协议陷入钻石问题:)