sharephoenix / YSToast

iOS Toast
MIT License
1 stars 0 forks source link

Swift 协议问题 #1

Open sharephoenix opened 4 years ago

sharephoenix commented 4 years ago

代码

protocol TestProtocol: NSObject {
    func printGg()
}

extension TestProtocol where Self: UIView {
    func printGg() {
        print("这里是默认方法")
    }
}

extension UIView: TestProtocol {

}

class Test: UIView {
    func printGg() {
        print("这里是 Test 方法")
    }
}

let t = Test()
t.printGg()
var array: [UIView & TestProtocol] = []
array.append(t)
if let v = array.first {
    v.printGg()
}
array.first?.printGg()

打印结果:

这里是 Test 方法
这里是默认方法
这里是默认方法

问题: 问什么从数组中取出来后调用方法打印结果变了呢?

sharephoenix commented 4 years ago

extension UIView: TestProtocol {} UIView 实现了 TestProtocol 协议,而 Test 没有直接实现协议方法。所以打印 这里是默认方法; 好像没有说清楚,后面研究下,在继续回答吧

sharephoenix commented 4 years ago
  1. 协议的方法调用,直接找到实现协议的实体。
  2. 如果子类有 override 父类的协议方法,则子类执行父类方法;否则,谁实现谁执行