1简介
(1)协议就是用来规范双方行为的
(2)swift语言中的协议作用是用来统一属性、方法、下标的
(3)协议自身是不实现自身的内容 由遵守协议的类、结构体、枚举来实现
2作用:
(1)、协议用来规范接口(方法)、属性、下标
(2)、协议能够间接实现多继承
//OC数组中只能存放AnyObject类型的数据
//Swift协议变量只是普通变量
//OC协议定义的变量就是AnyObject类型
3格式
/*
swift中协议的定义格式:
protocal 协议名称: 父协议1,父协议2... {
协议的内容
}
enum 枚举名称: 协议1,协议2... {
实现协议中的方法
}
struct 结构体名称: 协议1,协议2... {
实现协议中的方法
}
class 类名: 协议1, 协议2... {
}
class 类名: 父类名称,协议1,协议2...{
实现协议中的方法
}
*/
4方法
(1)使用协议指定属性
可以定义存储属性、类型属性, 必须注明属性的权限(get set)但是协议中定义的属性无论是存储属性还是计算属性 ,协议都是不做区分的。
protocol Drawer {
var borderWidth: Double{get set} // 读写属性
var borderColor: String{get}//只读属性
//即使协议中属性定义成只读的 实现属性的时候也可以添加set方法
}
//使用枚举包括所有的颜色值
enum Color {
case Blue
case Red
case Green
case Yellow
}
//设置图形的填充颜色
protocol FillColor {
var backGroundColor: Color?{get}
}
//协议可以继承
protocol GetArea: Drawer,FillColor {
var area: Double {get}
}
class Rectangle: GetArea {
var height: Double
var width: Double
init (height: Double,width: Double) {
self.width = width
self.height = height
}
var borderWidth: Double = 0.0
var borderColor: String = "红色"
var backGroundColor: Color? = Color.Blue
var area: Double {
return self.width * self.height
}
}
//协议中属性无论怎么定义 遵守协议的类可以对属性进行直接赋值或者使用计算属性形式赋值和获取
protocol FruitColor {
static var color: String {get}
}
protocol FruitWeight {
var weight: Double {get set}
}
class Fruit:FruitColor,FruitWeight {
var weight: Double {
get {
return 1.23
}
set {
print("我是Fruit类")
}
}
static var color: String = "绿色"
}
//协议规范了多个不同的类具有相同的属性和方法 和继承很像
(2)使用协议指定行为
protocol iOSCoder {
func writeiOSCoder()
func deBug()
static func reporting()
}
//遵守协议的类、结构体、枚举 必须实现协议中的方法
class iosMonkey: iOSCoder {
func writeiOSCoder() {
print("我会写ios代码")
}
func deBug() {
print("我有高深的调bug能力")
}
static func reporting() {
print("我会非常认真的对进度")
}
}
//[结论]一个协议可以由多个类遵守 一个类可以遵守多个协议 遵守多个协议的行为就是间接实现多继承
(3)协议中可以指定下标
protocol SubScriptPro {
subscript(index: Int)->Int{get}
}
class Point: SubScriptPro {
var x: Int
var y: Int
init (x: Int,y: Int) {
self.x = x
self.y = y
}
subscript(index: Int)->Int {
get {
switch index {
case 0:
return self.x
default:
return self.y
}
}
set {
switch index {
case 0:
self.x = newValue
default:
self.y = newValue
}
}
}
}
var p = Point.init(x: 0, y: 0)
p[0] = 100
p[1] = 200
print(p[0],p[1])
(4)协议中指定构造方法
protocol Initable {
init(name: String)
init(name: String,weight:Double)
func run()
// func test(name: String...) ✅
// func tmp(name = "12345678")
//[注意]协议中函数的形参可以定义成可变的 但是不能定义成固定的
}
class Person {
var name: String
init(name: String) {
self.name = name
}
}
class Man: Person,Initable {
var weight: Double
required convenience init(name: String, weight: Double) {
//[注意]当类遵守协议 实现协议中的构造方法 那么方法前面必须使用required修饰
// self.weight = weight
// super.init(name: name)
self.init(name: name)
}
required override init(name: String) {
//[注意]当类遵守协议 实现协议中的构造方法
//如果协议中的构造方法和父类中的构造方法同名 那么方法前就要添加required override
self.weight = 100.0
super.init(name: name)
}
func run() {
print("跑")
}
}
//类遵守协议 实现协议中的构造方法
//使用指定构造器或者便利构造器实现都是可以的 都需要在构造器前添加required
(5)使用协议类型定义变量、函数的形参、函数的返回值类型
let xiaoMan1: Initable = Man.init(name: "hello")
let xiaoMan2: Initable = Man.init(name: "world", weight: 100.0)
func show(man: Initable...) {
for i in man {
i.run()
}
}
show(xiaoMan1,xiaoMan2)
(6)规范方法/接口(协议的作用)
protocol Sum {
func add(a: Int,b: Int)
}
protocol Sub {
func subResult(a: Int,b: Int)
}
protocol Mul {
func mulResult(a: Int,b: Int)
}
protocol Div {
func divResult(a: Int,b: Int)
}
class Cal: Sum,Sub,Mul,Div {
func add(a: Int,b: Int) {
}
func subResult(a: Int,b: Int) {
}
func mulResult(a: Int,b: Int) {
}
func divResult(a: Int,b: Int) {
}
}