在Swift中,通过使用扩展,您可以在“协议”中提供方法体。在我的代码中,我能够提供方法体,参见
SELECT top 1
[YourColumn]
FROM [YourTable]
order by
left([YourColumn], charindex('/', [YourColumn]) - 1) asc
我知道我在ViewController类中提供了test1和test2对象的地址。所以“显示”被打印两次。但在“协议”中,我能够使用这些方法。
所以我的问题是为什么apple给我功能在“协议”中编写方法体?
有人可以帮我理解这个功能吗?
答案 0 :(得分:6)
虽然问题看起来很简单,但解释了面向协议编程的所有方面,并且out的重要性将使我围绕它编写完整的博客:)
无论如何,面向协议编程基本上使你能够利用多重继承,因为DiamondProblem
,面向对象编程语言如JAVA,Objective-C不支持现在虽然面向协议编程允许您对功能进行建模 /作为一个协议的功能而不是作为类的实例方法(如在Objective C的情况下)我们必须同意我们都喜欢继承!!,记住你曾经用一些操作声明一个方法,然后扩展它写任何特定的to child并仍然使用parent方法中的所有代码只需调用super.methodname ???现在你怎么可能在协议中实现它?你不能使用代码??
所以Protocols默认实现是向类提供默认实现的简单方法,它只是想扩展和确认协议,但不打算修改它。
示例:假设我有一个打印我的姓氏的协议,如果父类确认它,如果我同样确认相同的协议,它将打印与我相同的姓氏:)更正其所有的姓氏后赢得&# 39;改变!!!
仅仅因为您确认协议,如果协议已经有自己的默认实现,则无需提供其方法实现。如果您想要执行除提供的默认实现之外的其他操作,您将提供自己的内容:)
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&Test或&#39; s或Test2&#39; s ?? Swift在编译时解决它并告诉你在调用self.display()时模糊地使用display()
它仍然可能在你的代码中工作的唯一原因是因为你创建了两个类型为test1和test2的变量,并且你使用test1.display()和test2.display()调用了方法,这些没有歧义,但那是不是你想如何使用它不是吗?
所以基本上你永远无法通过Protocols进入Diamond问题:)