Swift 面向协议的tips

20 阅读1分钟

大佬链接

  • 定义一个协议
protocol GenshinWorld {
    var countryName:String { get set } // 国家名字
    var demonGod:String { get }  // 魔神
    static var montherLand:String { get } // 所属大陆
}
  • 定义一个结构体 遵循协议
struct Country:GenshinWorld {
    var countryName: String
    var demonGod: String
    static var montherLand: String = "提瓦特大陆"
    var theme:String = ""
}
  • 协议的属性赋初始值
extension GenshinWorld {
    var demonGod:String {
        get {
            return "巴巴托斯"
        }
    }
}
  • 协议添加方法
protocol GenshinWorld {
    var countryName:String { get set } // 国家名字
    var demonGod:String { get }  // 魔神
    static var montherLand:String { get } // 所属大陆
    
    static func demonWellKonwnSaying()
    mutating func changeDemonGodName()
}

struct Country:GenshinWorld {
    var countryName: String
    
    var demonGod: String
    
    static var montherLand: String = "提瓦特大陆"
    
    var theme:String = ""
    
    static func demonWellKonwnSaying() {
        print("原神启动")
    }
    
    mutating func changeDemonGodName() {
        self.demonGod = "温迪"
    }
}

修改结构体属性的方法一定要用 mutating 修饰

  • 一个小例子
protocol WindProtocol {
    func resistance(number:Double) // 抗性
}

class WindRole:WindProtocol {
    
    var name:String
    
    init(name: String) {
        self.name = name
    }
    
    func qSkill() {
        other()
    }
    
    func resistance(number: Double) {
        print("\(name) 减少 \(number) 风抗")
    }
}

extension WindProtocol where Self:WindRole {
    func other() {
        print("Q还能回血")
    }
}