swift 12.1 协议

来源:互联网 时间:2017-01-22


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")

Top