Day 11 Swift语法-进阶篇(4/5)-Protocol

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

<<:  第十八天:用 Plugin 扩充 TeamCity

>>:  Day-11 Set Associative Cache

[Day15] Flutter - 大海捞针不是办法 ( Dartz )

前言 Hi, 我是鱼板伯爵在原本的try&catch中我们可以截取大部分的错误,但是这仅能告诉我程序...

Day 18 Compose Gestures II

今年的疫情蛮严重的,希望大家都过得安好,希望疫情快点过去,能回到一些线下技术聚会的时光~ 今天目标:...

资料库:什麽是 unsigned integer

前言 一开始在设计资料库时常常不确定那个 type 要怎麽设,也不知道什麽是 unsigned in...

EP14 - 调整架构 EC2 与负载平衡器

昨天我们很有胆试的将 VPC 砍掉重建, 为的就是将网段重新安排, 但是还没处理好的部分, 则是 G...

Day24-介接 API(二)Google Calendar(II)Events——Read、Update、Delete

大家好~ 昨天成功在日历上新增 Event 了, 今天来对日历的 Event 做其他操作吧~ Rea...