//定义一个得分记录协议
protocol Record{
var wins:Int{get}
var losses:Int{get}
//胜率
func winningPercent() ->Double
}
//乒乓球比赛记录
class TableTennisRecord:Record,CustomStringConvertible{
var wins:Int =0
var losses:Int =0
func winningPercent() ->Double {
return (Double(wins)/Double(wins+losses))*100
}
var description:String{
returnString("Wins:\(wins) , Losses:\(losses)")
}
}
//羽毛球比赛记录
class BadmintonRecord:Record,CustomStringConvertible{
var wins:Int =0
var losses:Int =0
func winningPercent() ->Double {
return (Double(wins)/Double(wins+losses))*100
}
var description:String{
returnString("Wins:\(wins) , Losses:\(losses)")
}
}
let 马龙 =TableTennisRecord()
马龙.wins =11
马龙.losses =1
马龙.winningPercent()
let winningPercentStr = String(马龙.winningPercent())
if let lowerBound =winningPercentStr.range(of:".")?.lowerBound{
let winningPercent =winningPercentStr.substring(to: lowerBound)+"%"
}
let 林丹 =BadmintonRecord()
林丹.wins =21
林丹.losses =15
不难看出这几段有很多重复代码,这时协议的扩展就很重要了:
protocol Record:CustomStringConvertible{
var wins:Int{get}
var losses:Int{get}
}
//协议扩展
extension Record{
var description: String{
return String("Wins: \(wins) , Losses: \(losses)")
}
var totalGame:Int{
return wins+losses
}
//胜率
func winningPercent() -> Double {
return (Double(wins)/Double(totalGame))*100
}
//显示赢的次数(默认实现为返回赢的次数)
func showWins() -> Int{
return wins
}
}
//乒乓球比赛记录
class TableTennisRecord:Record{
var wins:Int = 0
var losses:Int = 0
func showWins() {
print("Ping pang wins \(wins)")
}
}
//羽毛球比赛记录
class BadmintonRecord:Record{
var wins:Int = 0
var losses:Int = 0
}
let 马龙 =TableTennisRecord()
马龙.wins =11
马龙.losses =1
马龙.winningPercent()
马龙.showWins()//Ping pang wins 11
let winningPercentStr = String(马龙.winningPercent())
if let lowerBound =winningPercentStr.range(of:".")?.lowerBound{
let winningPercent =winningPercentStr.substring(to: lowerBound)+"%"
}
let 林丹 =BadmintonRecord()
林丹.wins =21
林丹.losses =15
林丹.showWins()//21