1.swift协议的应用环境
在Swift中苹果技术团队将protocol这种语法发挥的更加深入和彻底。Swift中的protocol不仅能定义方法还能定义属性,配合extension扩展的使用还能提供一些方法的默认实现,而且不仅类可以遵循协议,现在的枚举和结构体也能遵循协议了。希望能给Swift开发的小伙伴们了解的更透彻。
2.协议的定义
(官方文档)指出,协议为方法、属性、以及其他特定的任务需求或功能定义蓝图。协议可被类、结构体、或枚举类型采纳以提供所需功能的具体实现。满足了协议中需求的任意类型都叫做遵循了该协议
协议中定义属性
protocol Student {
//可读可写的属性
varname: String { get set }
//可读属性
varbirthPlace: String { get }
}.
struct Puple: Student {
var name: String
var birthPlace: String ="北京"
}
var p1 = Puple(name:"小明", birthPlace:"上海")//实例中的属性同样可以被修改.但会不会有疑问?明明是只读的属性,为什么能修改了。 注意 协议中的“只读”属性修饰的是协议这种“类型“”的实例 如果还不理解就创建个对象比对就可以领会。
协议中定义方法
protocol Student {
//类方法static func study()//实例方法func changeName()}
struct CollageStudent: Student {
//类方法实现
static func study() {}//实例方法实现
func changeName() {}}
//方法的调用
CollageStudent.study()
var c1 = CollageStudent() c1.changeName()
注意:当我们在结构体中的方法修改到属性的时候需要在方法前面加上关键字mutating表示该属性能够被修改。而name属性也可读可写,不然也就没意义了不是。
协议中的初始化器
protocol Pet {
init(name: String)
}
class Cat: Pet {
varname: String ="Cat"
required init(name: String) {
self.name = name
}}//Cat由于遵循了Pet协议,应该用required关键字修饰初始化器的具体实现
注意:Swift中类的继承是单一的,但是类可以遵守多个协议,因此为了突出其单一父类的特殊性,我们应该将继承的父类放在最前面,将遵守的协议依次放在后面。
.多个协议重名方法调用冲突(解决呀)
protocol TextOne {func text() -> Int}
protocol TextTwo {func text() -> String}
同时继承这俩个类
struct Person: TextOne, TextTwo {
func text() -> Int {return10}
func text() -> String {return"hello"}}
let p1 = Person()
//尝试调用返回值为Int的方法
let num = p1.text()
//尝试调用返回值为String的方法
let string = p1.text()
调用一定是无法通过的,怎么解决,当然一般也不会这样设计,但脑子发热就要这样写怎么办,已解决:
//尝试调用返回值为Int的方法
let num = (p1 as TextOne).text()
//尝试调用返回值为String的方法
let string = (p1 as TextTwo).text()
协议的继承、聚合、关联类型
协议可以继承一个或者多个其他协议并且可以在它继承的基础之上添加更多要求。协议继承的语法与类继承的语法相似,选择列出多个继承的协议,使用逗号分隔
协议的聚合(这种模式小编较少使用,一方面不多见,另一方面代码过于复杂不便于开发设计也不推荐,看似高大上小编认为不够友好)这方面的设计swift是支持的。可以自行翻阅。
//协议聚合成临时的类型
typealias Three = TwoProtocol & OneProtocol
//协议聚合成为参数的类型
func text(paramter: OneProtocol & TwoProtocol) {
}