协议
协议的关键字是protocal。协议只需定义,没有实现的部分。
协议也分两种,属性协议和方法协议。
属性协议
属性协议的声明用var声明,在声明后,要设置get方法或者set方法、get方法一起设置。
//协议
class Person{
var age:Int
var name:String
init(name:String,age:Int){
self.name = name
self.age = age
}
}
protocol ProtocolStudent{
var classScore:Dictionary<String,Int>{
set get}
subscript(index:String)->Int{
set get}
}
class Student:Person,ProtocolStudent{
override init(name: String, age: Int) {
super.init(name: name, age: age)
}
var classScore: Dictionary<String, Int> = ["Chinese":0]
subscript(index: String) -> Int {
set{
classScore[index] = newValue
}get{
return classScore[index] ?? -1
}
}
}
var xiaoMing = Student(name: "xiaoMing", age: 18)
print(xiaoMing.classScore)
xiaoMing["Chinese"] = 90
xiaoMing["English"] = 75
print(xiaoMing.classScore)
运行结果:
["Chinese": 0]
["English": 75, "Chinese": 90]
方法协议
方法协议声明一个方法的雏形,包括参数列表和返回值,而遵守这个协议的类、结构体、枚举都需要实现该方法的具体实现。
protocol scoreReporting {
mutating func inputScore(scores:Double...)
}
struct Student : scoreReporting {
var name = "name"
var average = 0.0
var level = 0
var balance = 0.0
mutating func inputScore(scores:Double...) {
var sum:Double = 0.0
for score in scores {
sum += score
}
self.average = sum/Double(scores.count)
if self.average > 70 {
self.level = 9
}else{
self.level = 8
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
var xiaoMing = Student()
xiaoMing.name = "xiaoHong"
xiaoMing.inputScore(scores: 95.0,84.5,91.0,77.0)
print(xiaoMing);
}
运行结果:
Student(name: "xiaoHong", average: 86.875, level: 9)
协议的类型限定
protocol ProtocaltTalk{
associatedtype words
func say(words:words)
}
class Person:ProtocaltTalk{
var age:Int
var name:String
init(name:String,age:Int){
self.name = name
self.age = age
}
func say(words: String) {
print("\(self.name) say : " + words)
}
}
class Dog:ProtocaltTalk{
var name:String = ""
init(name:String) {
self.name = name
}
func say(words: String) {
print("\(self.name) say : " + words)
}
}
var xiaoMing = Person(name: "xiaoMing", age: 18)
var xiaoMingsDog = Dog(name:"Wang")
xiaoMing.say(words: "修勾你饿了吗")
xiaoMingsDog.say(words: "wang wang wang!")
运行结果:
xiaoMing say : 修勾你饿了吗
Wang say : wang wang wang