Swift協(xié)議Protocol介紹
協(xié)議(Protocol)
1、協(xié)議可以用來定義方法、屬性、下標(biāo)的聲明,協(xié)議可以被枚舉、結(jié)構(gòu)體、類遵守(多個(gè)協(xié)議之間用逗號(hào)隔開)
protocol Drawable {
func draw()
var x: Int { get set }
var y: Int { get }
subscript(index: Int) -> Int { get set }
}2、協(xié)議中定義方法時(shí)不能有默認(rèn)參數(shù)值
3、默認(rèn)情況下,協(xié)議中定義的內(nèi)容必須全部都實(shí)現(xiàn)
協(xié)議中的屬性
1、協(xié)議中定義屬性時(shí)必須用var關(guān)鍵字
2、實(shí)現(xiàn)協(xié)議時(shí)屬性權(quán)限要不小于協(xié)議中定義的屬性權(quán)限
協(xié)議定義get、set,用var存儲(chǔ)屬性或get、set計(jì)算屬性去實(shí)現(xiàn)
協(xié)議定義get,用任何屬性都可以實(shí)現(xiàn)
class Person: Drawable {
var x: Int = 0
let y: Int = 0
func draw() {
print("Person draw")
}
subscript(index: Int) -> Int {
set {}
get { index }
}
}class Person: Drawable {
var x: Int {
get { 0 }
set {}
}
var y: Int {
get { 0 }
}
func draw() {
print("Person draw")
}
subscript(index: Int) -> Int {
set {}
get { index }
}
}static、class
1、為了保證通用,協(xié)議中必須用static定義類型方法、類型屬性、類型下標(biāo)
protocol Drawable {
static func draw()
}
class Person1: Drawable {
class func draw() {
print("Person1 draw")
}
}
class Person2: Drawable {
static func draw() {
print("Person2 draw")
}
}mutating
1、只有將協(xié)議中的實(shí)例方法標(biāo)記為mutating
才允許結(jié)構(gòu)體、枚舉的具體實(shí)現(xiàn)修改自身內(nèi)存
類在實(shí)現(xiàn)方法時(shí)不用加mutating,枚舉、結(jié)構(gòu)體才需要加mutating
protocol Drawable {
mutating func draw()
}
class Size: Drawable {
var width: Int = 0
func draw() {
width = 10
}
}
static Point: Drawable {
var x: Int = 0
mutating func draw() {
x = 10
}
}init
1、協(xié)議里面還可以定義初始化器init
非final類實(shí)現(xiàn)時(shí)必須加上required
protocol Drawable {
init(x: Int, y: Int)
}
class Point: Drawable {
required init(x: Int, y: Int) {
}
}
final class Size: Drawable {
init(x: Int, y: Int) {
}
}2、如果從協(xié)議實(shí)現(xiàn)的初始化器,剛好是重寫了父類的指定初始化器
那么這個(gè)初始化必須同時(shí)加required、override
protocol Liveable {
init(age: Int)
}
class Person {
init(age: Int) {}
}
class Student: Person, Liveable {
required override init(age: Int) {
super.init(age: age)
}
}init、init?、init!
1、協(xié)議中定義的init?、init!,可以用init、init?、init!去實(shí)現(xiàn)
2、協(xié)議中定義的init,可以用init、init!去實(shí)現(xiàn)
protocol Liveable {
init()
init?(age: Int)
init!(no: Int)
}
class Person: Liveable {
required init() {}
// required init!() {}
required init?(age: Int) {}
// required init!(age: Int) {}
// required init(age: Int) {}
required init!(no: Int) {}
// required init?(no: Int) {}
// required init(no: Int) {}
}協(xié)議的繼承
1、一個(gè)協(xié)議可以繼承其他協(xié)議
協(xié)議組合
1、協(xié)議組合,可以包含1個(gè)類類型(最多1個(gè))
protocol Livable {}
protocol Runnable {}
class Person {}
//接收Person或者其子類的實(shí)例
func fn0(obj: Person) {}
//接收遵守Livable協(xié)議的實(shí)例
func fn1(obj: Livable) {}
//接收同時(shí)遵守Livable和Runnable協(xié)議的實(shí)例
func fn2(obj: Livable & Runnable) {}
//接收同時(shí)遵守Livable、Runnable協(xié)議,并且是Person或者其子類的實(shí)例
func fn3(obj: Person & Livable & Runnable) {}typealias RealPerson = Person & Livable & Runnable
func fn4(obj: RealPerson) {}CaseIterable
1、讓枚舉遵守CaseIterable協(xié)議,可以實(shí)現(xiàn)遍歷枚舉值
enum Season: CaseIterable {
case spring, summer, autumn, winter
}
let seasons = Season.allCases
print(seasons.count) // 4
for season in seasons {
print(season)
}CustomStringConvertible
1、遵守CustomStringConvertible協(xié)議,可以自定義實(shí)例的打印字符串
class Person: CustomStringConvertible {
var age: Int
var name: String
init(age: Int, name: String) {
self.age = age
self.name = name
}
var description: String {
"age = \(age), name = \(name)"
}
}
var p = Person(age: 10, name: "Jack")
print(p) // age = 10, name = Jack到此這篇關(guān)于Swift協(xié)議Protocol介紹的文章就介紹到這了,更多相關(guān)Swift Protocol內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
純swift實(shí)現(xiàn)ipad版簡(jiǎn)單美團(tuán)界面功能
這篇文章主要為大家詳細(xì)介紹了純swift實(shí)現(xiàn)ipad版簡(jiǎn)單美團(tuán)界面功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
swift實(shí)現(xiàn)自定義圓環(huán)進(jìn)度提示效果
這篇文章主要為大家詳細(xì)介紹了swift實(shí)現(xiàn)自定義圓環(huán)進(jìn)度提示效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
Swift學(xué)習(xí)教程之SQLite的基礎(chǔ)使用
這篇文章主要給大家介紹了關(guān)于Swift學(xué)習(xí)教程之SQLite的基礎(chǔ)使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Swift SQLite具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Swift中用到extension的一些基本的擴(kuò)展功能講解
這篇文章主要介紹了Swift的一些基本的擴(kuò)展功能,即extension關(guān)鍵字的使用,需要的朋友可以參考下2015-11-11

