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对象的地址.所以"显示"被打印两次.但在"协议"中,我能够使用这些方法.
所以我的问题是为什么苹果给我功能在"协议"中编写方法体?
任何人都可以帮我理解这个功能吗?
虽然这个问题看起来很简单,但解释了面向协议编程的所有方面,并且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()调用了方法,这没有任何歧义,但那不是你怎么样的想用它不是吗?
所以基本上你永远不会陷入与协议的钻石问题:)
| 归档时间: |
|
| 查看次数: |
1823 次 |
| 最近记录: |