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)手勢識(shí)別的方法
這篇文章主要介紹了在Swift程序中實(shí)現(xiàn)手勢識(shí)別的方法,蘋果的Swift語言即將進(jìn)入2.0開源階段,人氣爆棚中:D 需要的朋友可以參考下2015-07-07深入理解Swift中單例模式的替換及Swift 3.0單例模式的實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于Swift中單例模式替換的相關(guān)資料,然后又跟大家分享了關(guān)于Swift3.0 單例模式實(shí)現(xiàn)的幾種方法-Dispatch_Once的內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11Swift中內(nèi)置的集合類型學(xué)習(xí)筆記
Swift中自帶數(shù)組、set、字典三大集合類型,這里將學(xué)習(xí)過程中的基礎(chǔ)的Swift中內(nèi)置的集合類型學(xué)習(xí)筆記進(jìn)行整理,需要的朋友可以參考下2016-06-06