Swift学习之协议二

作者: 冷武橘 | 来源:发表于2020-09-23 10:23 被阅读0次

    一、协议和扩展

    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。

    相关文章

      网友评论

        本文标题:Swift学习之协议二

        本文链接:https://www.haomeiwen.com/subject/rpolyktx.html