Swift基础 协议

协议

协议的关键字是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

猜你喜欢

转载自blog.csdn.net/kkkenty/article/details/124607147