Protocol又叫做協定,我們可以透過協定,去讓我們的class或struct去遵從這個協定裡所規範的東西,假設我們的class裡有個func,我如果要改變func的東西,我就要使用override func去重新設定我的func。但是透過protocol我就可以不用使用override。
譬如:
class showUserId {
func showUserId() {
}
}
class User1: showUserId {
override func showUserId() {
print("1234")
}
}
let user1 = User1()
user1.showUserId()
透過我們之前說過的重寫,我就可以讓使用者1的ID顯示出來,但是如果我們忘記重寫,就會變成這樣:
所以我們為了避免這種情況發生,我們就可以使用protocol,protocol使用方法如下:
class class名稱: 第一個Protocol, 第二個Protocol {
//你要做的事情
}
以剛剛的例子來說,用protocol就會變成這樣:
protocol userId {
func showUserId()
}
class User1: userId {
func showUserId() {
print("User1的使用者ID為: 123456789")
}
}
class User2: userId{
func showUserId(){
print("User2的使用者ID為: 987654321")
}
}
let user1 = User1()
let user2 = User2()
user1.showUserId()
user2.showUserId()
透過這樣我就不用去寫override func了,不過有點要注意的是,protocol裡面寫了什麼,那你的遵從的class裡面就要有,譬如:
protocol userId {
func showUserId()
}
class User1: userId {
var userName = "allen"
}
我直接不理protocol裡面的func,而是直接在裡面做我要做的事,例如宣告一個字串,這樣就會報錯,既然是協定,我們就要去遵從他,像這樣:
protocol userId {
func showUserId()
var height: Int {get}
var userName: String {get}
}
class User1: userId {
var height = 170
var userName = "allen"
func showUserId() {
print("User1的使用者ID為: 123456789")
print("User1的使用者身高為:\(height)")
}
}
class User2: userId {
var height = 168
var wieght = 50
var userName = "tom"
func showUserId(){
print("User2的使用者ID為: 987654321")
print("User2的使用者名稱為:\(userName)")
}
}
let user1 = User1()
let user2 = User2()
user1.showUserId()
user2.showUserId()
不管你要在你的class宣告其他額外的東西,只要是遵從protocol的class,裡面就一定要放protocol的東西~
如果你有多個protocol,協定跟協定之間只要用逗點隔開就可以了。最常見的例子就是在我們app練習的時候會看到的UIViewController, UITableViewDelegate, UITableViewDataSource的使用。
那如果你有class要繼承的話,只要把你要繼承的父類別寫在protoaol前面並用逗點隔開就好了:
class class名稱: 父類別, 第一個Protocol, 第二個Protocol {
//你要做的事情
}