iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0
Mobile Development

IOS菜逼八連續30天挑戰系列 第 11

Day 11 Swift語法-進階篇(4/5)-Protocol

  • 分享至 

  • xImage
  •  

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 {
    //你要做的事情
}

上一篇
Day 10 Swift語法-進階篇(3/5)-Initialization
下一篇
Day 12 Swift語法-進階篇(5/5)-Extension
系列文
IOS菜逼八連續30天挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言