一微驶、協(xié)議和擴展
1、協(xié)議
如果一個類型已經(jīng)實現(xiàn)了協(xié)議的所有要求,但是還沒有聲明它遵守了這個協(xié)議因苹,可以通過擴展來讓它遵守這個協(xié)議苟耻。
protocol TestProtocol {
func test()
}
class Student{
func test() {}
}
extension Student : TestProtocol {}
2、擴展
extension還可以給協(xié)議擴展
protocol TestProtocol {
func test()
static func run()
}
extension TestProtocol{
func test() {
print("擴展可以給協(xié)議提供默認的協(xié)議")
}
static func run() {
print("擴展可以給協(xié)議提供默認的實現(xiàn)")
}
func sayHello() {
print("擴展還可以給協(xié)議擴充從未聲明的方法")
}
}
class Student:TestProtocol{}
class Person: TestProtocol{}
Student.run()
Person.run()
let p = Person()
p.sayHello()
- 1扶檐、擴展可以給協(xié)議提供默認的實現(xiàn)凶杖,也間接實現(xiàn)可選協(xié)議的效果。
- 2款筑、擴展可以給協(xié)議擴充(協(xié)議中從未聲明過的方法)
3智蝠、可選協(xié)議
swift中協(xié)議中的方法都是必須實現(xiàn)的,因此要想實現(xiàn)像oc那樣optional的效果奈梳,只有通過以下兩種方式:
- 1杈湾、巧妙利用協(xié)議的擴展,給協(xié)議提供默認的實現(xiàn)
protocol Drawable {
func test()
}
extension Drawable{
func test() {
print("優(yōu)雅地實現(xiàn)了oc協(xié)議中optional的效果")
}
}
class Student:Drawable {
}
- 2、swift中調(diào)用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代表只有類才能遵守的協(xié)議毛秘,因此協(xié)議必須繼承AnyObject。