一、协议和扩展
1、协议
如果一个类型已经实现了协议的所有要求,但是还没有声明它遵守了这个协议,可以通过扩展来让它遵守这个协议。
protocol TestProtocol {
func test()
}
class Student{
func test() {}
}
extension Student : TestProtocol {}
2、扩展
extension还可以给协议扩展
protocol TestProtocol {
func test()
static func run()
}
extension TestProtocol{
func test() {
print("扩展可以给协议提供默认的协议")
}
static func run() {
print("扩展可以给协议提供默认的实现")
}
func sayHello() {
print("扩展还可以给协议扩充从未声明的方法")
}
}
class Student:TestProtocol{}
class Person: TestProtocol{}
Student.run()
Person.run()
let p = Person()
p.sayHello()
- 1、扩展可以给协议提供默认的实现,也间接实现可选协议的效果。
- 2、扩展可以给协议扩充(协议中从未声明过的方法)
3、可选协议
swift中协议中的方法都是必须实现的,因此要想实现像oc那样optional的效果,只有通过以下两种方式:
- 1、巧妙利用协议的扩展,给协议提供默认的实现
protocol Drawable {
func test()
}
extension Drawable{
func test() {
print("优雅地实现了oc协议中optional的效果")
}
}
class Student:Drawable {
}
- 2、swift中调用oc的api
@objc protocol Drawable {
@objc optional func test()
}
class Student:Drawable { }
二、代理
class ViewController: UIViewController,Testdelegate {
func test() {
print("测测测")
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let sec = SecController()
sec.delegate = self
self.present(sec, animated:true, completion: nil)
}
}
protocol Testdelegate:AnyObject {
func test()
}
class SecController: UIViewController {
weak var delegate:Testdelegate?
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .red
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.delegate?.test()
}
}
- weak只能修饰class对象,而AnyObject代表只有类才能遵守的协议,因此协议必须继承AnyObject。