1簡(jiǎn)介
(1)協(xié)議就是用來(lái)規(guī)范雙方行為的
(2)swift語(yǔ)言中的協(xié)議作用是用來(lái)統(tǒng)一屬性拂酣、方法区宇、下標(biāo)的
(3)協(xié)議自身是不實(shí)現(xiàn)自身的內(nèi)容 由遵守協(xié)議的類(lèi)、結(jié)構(gòu)體捅伤、枚舉來(lái)實(shí)現(xiàn)
2作用:
(1)轴术、協(xié)議用來(lái)規(guī)范接口(方法)难衰、屬性、下標(biāo)
(2)逗栽、協(xié)議能夠間接實(shí)現(xiàn)多繼承
//OC數(shù)組中只能存放AnyObject類(lèi)型的數(shù)據(jù)
//Swift協(xié)議變量只是普通變量
//OC協(xié)議定義的變量就是AnyObject類(lèi)型
3格式
/*
swift中協(xié)議的定義格式:
protocal 協(xié)議名稱(chēng): 父協(xié)議1,父協(xié)議2... {
協(xié)議的內(nèi)容
}
enum 枚舉名稱(chēng): 協(xié)議1盖袭,協(xié)議2... {
實(shí)現(xiàn)協(xié)議中的方法
}
struct 結(jié)構(gòu)體名稱(chēng): 協(xié)議1,協(xié)議2... {
實(shí)現(xiàn)協(xié)議中的方法
}
class 類(lèi)名: 協(xié)議1, 協(xié)議2... {
}
class 類(lèi)名: 父類(lèi)名稱(chēng)彼宠,協(xié)議1,協(xié)議2...{
實(shí)現(xiàn)協(xié)議中的方法
}
*/
4方法
(1)使用協(xié)議指定屬性
可以定義存儲(chǔ)屬性鳄虱、類(lèi)型屬性, 必須注明屬性的權(quán)限(get set)但是協(xié)議中定義的屬性無(wú)論是存儲(chǔ)屬性還是計(jì)算屬性 ,協(xié)議都是不做區(qū)分的。
protocol Drawer {
var borderWidth: Double{get set} // 讀寫(xiě)屬性
var borderColor: String{get}//只讀屬性
//即使協(xié)議中屬性定義成只讀的 實(shí)現(xiàn)屬性的時(shí)候也可以添加set方法
}
//使用枚舉包括所有的顏色值
enum Color {
case Blue
case Red
case Green
case Yellow
}
//設(shè)置圖形的填充顏色
protocol FillColor {
var backGroundColor: Color?{get}
}
//協(xié)議可以繼承
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
}
}
//協(xié)議中屬性無(wú)論怎么定義 遵守協(xié)議的類(lèi)可以對(duì)屬性進(jìn)行直接賦值或者使用計(jì)算屬性形式賦值和獲取
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類(lèi)")
}
}
static var color: String = "綠色"
}
//協(xié)議規(guī)范了多個(gè)不同的類(lèi)具有相同的屬性和方法 和繼承很像
(2)使用協(xié)議指定行為
protocol iOSCoder {
func writeiOSCoder()
func deBug()
static func reporting()
}
//遵守協(xié)議的類(lèi)凭峡、結(jié)構(gòu)體拙已、枚舉 必須實(shí)現(xiàn)協(xié)議中的方法
class iosMonkey: iOSCoder {
func writeiOSCoder() {
print("我會(huì)寫(xiě)ios代碼")
}
func deBug() {
print("我有高深的調(diào)bug能力")
}
static func reporting() {
print("我會(huì)非常認(rèn)真的對(duì)進(jìn)度")
}
}
//[結(jié)論]一個(gè)協(xié)議可以由多個(gè)類(lèi)遵守 一個(gè)類(lèi)可以遵守多個(gè)協(xié)議 遵守多個(gè)協(xié)議的行為就是間接實(shí)現(xiàn)多繼承
(3)協(xié)議中可以指定下標(biāo)
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)協(xié)議中指定構(gòu)造方法
protocol Initable {
init(name: String)
init(name: String,weight:Double)
func run()
// func test(name: String...) ?
// func tmp(name = "12345678") ??
//[注意]協(xié)議中函數(shù)的形參可以定義成可變的 但是不能定義成固定的
}
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) {
//[注意]當(dāng)類(lèi)遵守協(xié)議 實(shí)現(xiàn)協(xié)議中的構(gòu)造方法 那么方法前面必須使用required修飾
// self.weight = weight
// super.init(name: name)
self.init(name: name)
}
required override init(name: String) {
//[注意]當(dāng)類(lèi)遵守協(xié)議 實(shí)現(xiàn)協(xié)議中的構(gòu)造方法
//如果協(xié)議中的構(gòu)造方法和父類(lèi)中的構(gòu)造方法同名 那么方法前就要添加required override
self.weight = 100.0
super.init(name: name)
}
func run() {
print("跑")
}
}
//類(lèi)遵守協(xié)議 實(shí)現(xiàn)協(xié)議中的構(gòu)造方法
//使用指定構(gòu)造器或者便利構(gòu)造器實(shí)現(xiàn)都是可以的 都需要在構(gòu)造器前添加required
(5)使用協(xié)議類(lèi)型定義變量、函數(shù)的形參摧冀、函數(shù)的返回值類(lèi)型
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)規(guī)范方法/接口(協(xié)議的作用)
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) {
}
}