Swift学习之协议二

一、协议和扩展

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。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。