Swift专题讲解二十一——协议

简介: Swift专题讲解二十一——协议

一、引言

    协议约定了一些属性与方法,其作用类似Java中的抽象类,Swift中类型通过遵守协议来实现一些约定的属性和方法。Swift中的协议使用protocol关键字来声明。Swift中的协议还有一个十分有意思的特性,协议可以通过扩展来实现一些方法和附加功能。

二、在协议中定义属性和方法

    协议中定义的属性只约定名称和类型,在具体类型的实现中,其可以是存储属性也可以是计算属性,协议中还需要指定属性是可读的还是可读可写的。示例代码如下:

protocol MyPortocol {

//定义实例属性
//可读的
var name:String{get}
//可读可写的
var age:Int{set get}
//可读的
var nameAndAge:String{get}
static var className:String{get}

}
class MyClass: MyPortocol {

var name: String
var age: Int
var nameAndAge: String{
    get{
        return "\(name)"+"\(age)"
    }
}
static var className: String{
    get{
        return "MyClass"
    }
}
init(){
    name = "HS"
    age = 24
}

}
有一点需要注意,协议中的可读并不是只读,协议中的属性约定成可读可写,则在实现时,这个属性必须是可读可写的,但是如果协议中约定成可读的,则此属性可以是只读的也可以是可读可写的,看具体的实现。

    协议中约定的方法可以是实例方法也可以是类型方法,示例如下:

protocol MyPortocol {

func logName()
static func logClassName()

}
class MyClass: MyPortocol {

var name: String
var age: Int
init(){
    name = "HS"
    age = 24
}
func logName() {
    print(name)
}
static func logClassName() {
    print(className)
}

}
同样,协议中也可以对构造方法进行定义约定。

三、协议的特点

    协议中虽然没有任何属性和方法的实现,但是其仍然可以当做类型来使用,在函数参数、返回值中应用广泛,示例如下:

protocol MyPortocol {

//定义实例属性
var name:String{get}
var age:Int{set get}
var nameAndAge:String{get}
static var className:String{get}
func logName()
static func logClassName()

}
//将协议类型作为参数
func test(param:MyPortocol) {

param.logName()

}
协议作为类型这种用法另一个应用点是在集合类型中,协议可以作为所有遵守此协议的集合类型。

    协议可以像其他类型一样进行继承,子协议将自动拥有父协议约定的属性和方法。协议也可以通过class关键字来定义只有类可以进行遵守,示例如下:

protocol MyPortocol {

//定义实例属性
var name:String{get}
var age:Int{set get}
var nameAndAge:String{get}
static var className:String{get}
func logName()
static func logClassName()

}
//只有类可以继承此协议
protocol MySubPortocol:class,MyPortocol {

}

    协议既然可以像其他类型一样进行使用,当然它也可以使用is,as?,as!进行检查和转换,关于is,as的更多用法可以查看Swift关于类型转换的内容。

    协议也可定义其中的属性或方法为可选的,即遵守此协议的类可以实现也可以不实现可选的属性和方法,然而,声明为可选的需要此协议为@objc类型的,示例如下:

@objc protocol MyPortocol {

//定义实例属性
var name:String{get}
var age:Int{set get}
var nameAndAge:String{get}
static var className:String{get}
func logName()
//可选实现
optional static func logClassName()

}

    Swift中的协议还有一个十分重要的特性,其可以通过扩展来进行属性、方法以及下标的实现。这对于一些通用类的方法十分方便,这相当于所有继承此协议的类都默认实现了这样的方法,示例如下:

protocol MyPortocol {

//定义实例属性
var name:String{get}
var age:Int{set get}
var nameAndAge:String{get}
static var className:String{get}
func logName()
static func logClassName()

}
extension MyPortocol{

var name:String{
    return "HS"
}

}

目录
相关文章
|
7月前
|
Swift iOS开发
Swift 语言: 什么是协议(Protocol)?如何实现和使用协议?
Swift 语言: 什么是协议(Protocol)?如何实现和使用协议?
197 2
|
算法 Swift C++
34 Swift为了协议 关联类型
Swift为了协议 关联类型
75 0
|
存储 Swift iOS开发
31 Swift 继续聊聊协议扩展
Swift 继续聊聊协议扩展
110 0
|
21天前
|
存储 Swift 开发者
Swift 协议
Swift 协议
23 0
|
7月前
|
设计模式 Swift iOS开发
【Swift开发专栏】Swift中的协议与委托模式
【4月更文挑战第30天】Swift编程语言强调协议与委托模式。协议定义了类型需实现的方法和属性,如`SomeProtocol`示例。遵循协议的类、结构体或枚举需实现协议要求。协议可继承,也可作为类型使用。委托模式让对象间通信更灵活,通过协议实现,如`DataSourceDelegate`示例。实战案例展示了在`UITableView`和自定义下载器中使用委托模式。
126 0
|
5月前
|
存储 安全 Swift
Swift高级特性:泛型与协议
【7月更文挑战第10天】Swift高级特性:泛型与协议增强代码复用与类型安全。泛型允许编写通用代码,如`swap`函数和泛型`Stack`结构体,支持类型约束如`Comparable`。协议定义行为蓝图,类型遵循协议需实现其要求。通过两者结合,构建高效灵活的代码结构。
|
Swift C++ Ruby
32 Swift面向协议编程初探
32 Swift面向协议编程初探
71 0
|
存储 前端开发 Swift
Swift实用小册20: Protocol协议的使用
在本章中,你将学会Protocol协议的使用方法。
274 0
Swift实用小册20: Protocol协议的使用
|
存储 安全 Java
Swift5.0 - day5-继承、初始化、可选链、协议(上)
Swift5.0 - day5-继承、初始化、可选链、协议(上)
129 0
Swift5.0 - day5-继承、初始化、可选链、协议(上)
|
Swift C++
Swift-进阶 10:可选类型Optional & Equatable+Comparable协议
Swift-进阶 10:可选类型Optional & Equatable+Comparable协议
349 0
Swift-进阶 10:可选类型Optional & Equatable+Comparable协议