把oc的协议和swift对比一下你就会发现swift的协议功能很强大,不过现在我也只是略懂一点点,现在把自己对协议的一点点理解贴出来,这里只讨论类型的协议,不讨论结构体和枚举的协议,举一反三,了解类型的协议之后其他的应该学起来也很快。
声明协议协议里面声明了一个方法和一个属性
@objc protocol SonOneProtocol {
//声明一个协议方法
func change(a:Int) -> Int
//声明一个属性(get可读,set可写)
@objc optional var age:Int {get set}
}
创建个类SonOne,类里面声明了一个代理,后面会用到
class SonOne: Person {
var oneName = "我是son1"
//在sonone类中添加一个sonOneProtocol协议类型的属性
var delegate:SonOneProtocol?
func callChange() {
//调用协议
self.delegate?.change(a:100)
}
}
//导入协议,让viewcontroller遵守这个协议,VC里面添加了按钮用来触发协议的,也可以用其他方式出发,根据各自情况而定
class ViewController: UIViewController,SonOneProtocol{
//override 重写父类方法需要写加此标记
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.white
//添加一个button
let button = UIButton()
button.frame = CGRect.init(x: 100, y: 200, width: 200, height: 50)
button.backgroundColor = UIColor.gray
button.setTitle("我是一个button", for: UIControlState.normal)
button.addTarget(self, action:#selector(buttonAction(_:)), for: .touchUpInside)
self.view.addSubview(button)
//初始化
pers1 = SonOne()
pers1?.delegate = self
}
func buttonAction(_ button:UIButton) {
print("点击了按钮");
//点击按钮的时候调用协议
pers1?.callChange()
pers1?.extenCallChange()
}
//实现协议方法
func change(a:Int) -> Int {
str = "我在协议方法里更改了属性值"
print(str!);
return a
}
//实现协议的属性
var age = 200;
}
到这里基本协议就是这样的,和oc对比差不多,用法是按照oc的用法,
接下来还有
协议的继承
协议可以继承,oc中的协议也是可以继承的,
接下来
@objc protocol SonTwoProtocol:SonOneProtocol{
//添加继承方法
@objc optional func extenChangge()
}
这样就可以了,使用起来和正常协议一样使用即可
注意!!!有这种情况怎么办?
有这种情况怎么办?
如果某个类遵守两个协议,但是这两个协议有两个方法名一样的方法怎么办
//协议1
@objc protocol SonOneProtocol {
//声明一个协议方法
func change(a:Int) -> Int
//声明一个属性(get可读,set可写)
@objc optional var age:Int {get set}
}
//协议2
protocol SonThreeProtocol {
func change(b:String) -> String
}
这个两个协议有两个方法名一样的方法
让一个类遵守这个两个协议
class SonOne: SonOneProtocol, SonThreeProtocol {
func change(b:String) -> String{return b}
func change(a:Int) -> Int{return a}
}
我们调用的时候就不知道是哪个方法怎么办?
可以这样解决
let p1 = SonOne()
let num = (p1 as SonOneProtocol). change(a:100)
let string = (p1 as SonThreeProtocol). change(b:"100")
类型扩展
类型的扩展和添加计算型属性,方法等等
很方便,
接下来介绍扩展一个类型并且遵守一个协议
简单看下
//类的扩展
extension SonOne{
//添加属性
var extenName:String { return "我是扩展后的属性"}
//添加方法
func extenCallChange() {
print("extenCallChange")
}
}
//类的扩展,并且遵守继承的协议,当遵守某个协议的时候要实现协议里面的方法
extension SonOne:SonTwoProtocol{
func change(a: Int) -> Int { return a }
func extenChangge() {}
}