Swift協(xié)議Protocol介紹
協(xié)議(Protocol)
1、協(xié)議可以用來(lái)定義方法、屬性、下標(biāo)的聲明,協(xié)議可以被枚舉、結(jié)構(gòu)體、類(lèi)遵守(多個(gè)協(xié)議之間用逗號(hào)隔開(kāi))
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定義類(lèi)型方法、類(lèi)型屬性、類(lèi)型下標(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)存
類(lè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類(lèi)實(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)的初始化器,剛好是重寫(xiě)了父類(lèi)的指定初始化器
那么這個(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è)類(lèi)類(lèi)型(最多1個(gè))
protocol Livable {}
protocol Runnable {}
class Person {}
//接收Person或者其子類(lèi)的實(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或者其子類(lèi)的實(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內(nèi)存管理指針類(lèi)型使用實(shí)例詳解
這篇文章主要為大家介紹了swift內(nèi)存管理指針類(lèi)型使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
在Swift程序中實(shí)現(xiàn)手勢(shì)識(shí)別的方法
這篇文章主要介紹了在Swift程序中實(shí)現(xiàn)手勢(shì)識(shí)別的方法,蘋(píng)果的Swift語(yǔ)言即將進(jìn)入2.0開(kāi)源階段,人氣爆棚中:D 需要的朋友可以參考下2015-07-07
Swift語(yǔ)言中的一些訪問(wèn)控制設(shè)置詳解
這篇文章主要介紹了Swift語(yǔ)言中的一些訪問(wèn)控制設(shè)置詳解,是Swift入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-11-11
Swift使用Cocoa中的數(shù)據(jù)類(lèi)型教程
這篇文章主要介紹了Swift使用Cocoa中的數(shù)據(jù)類(lèi)型教程,Swift 會(huì)自動(dòng)將一些 Objective-C 類(lèi)型轉(zhuǎn)換為 Swift 類(lèi)型,以及將 Swift 類(lèi)型轉(zhuǎn)換為 Objective-C 類(lèi)型,需要的朋友可以參考下2014-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)容,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-11-11
Swift中內(nèi)置的集合類(lèi)型學(xué)習(xí)筆記
Swift中自帶數(shù)組、set、字典三大集合類(lèi)型,這里將學(xué)習(xí)過(guò)程中的基礎(chǔ)的Swift中內(nèi)置的集合類(lèi)型學(xué)習(xí)筆記進(jìn)行整理,需要的朋友可以參考下2016-06-06

