1.OC中的协议只能用于类,swift中的协议不仅能用于类,还能用于结构体和枚举
2.OC中的协议可以设置可选实现,但Swift中的协议必须实现
3.Swift中的协议增加了一个关键字mutating可以决定结构体和枚举实现协议的时候,是否可以修改属性的值
//扩展
extensionInt{
funcdescription() ->String{
// Self的好处:专门用于不确定数据类型的
return"Int类型的数字\(self)"
}
}
print(3.description())
//协议扩展的好处1:
protocolProtocolNumber {
funcdescribe() ->String
}
//扩展实现协议
extensionInt:ProtocolNumber{
funcdescribe() ->String{
return"Int类型的数字\(self)"
}
}
extensionDouble:ProtocolNumber{
funcdescribe() ->String{
return"Double类型的数字\(self)"
}
}
//定义一个协议类型
vara:ProtocolNumber=2
print(a.describe())
a=3.14
print(a.describe())
//协议扩展的好处2:
//定义一个协议
protocolNumberProtocol{
}
//扩展实现协议
extensionInt:NumberProtocol{
}
extensionDouble:NumberProtocol{
}
//给协议扩展方法
extensionNumberProtocol{
funcdescription() ->String{
ifselfisInt{
return"我是一个Int类型的数字\(self)"
}
ifselfisDouble{
return"我是一个Double类型的数字\(self)"
}
return"我既不是Int也不是Double类型的数字\(self)"
}
}
//可以整形调用或者浮点型调用
print(3.44.description())
print(3.description())
//案例需求:给所有数字类型,扩展一个平方的函数,返回自己的操作
//定义个协议
protocolNumbersProtocol{
}
//扩展实现协议
extensionInt:NumbersProtocol{
}
extensionDouble:NumbersProtocol{
}
//给协议扩展方法3
extensionNumbersProtocol{
//我们不确定返回的Self到底是什么类型
funcsquareValue() ->Self{
ifselfisInt{
letn =selfas!Int
returnn * nas!Self
}
ifselfisDouble{
letn =selfas!Double
returnn * nas!Self
}
return0as!Self
}
}
print(3.44.squareValue())
print(3.squareValue())
//定义一个协议
protocolLoveMusic {
funcsongMusic()
varsimpleDescription:String{get}
//mutating可以决定结构体和枚举实现协议的时候,是否可以修改属性的值
mutatingfuncmodifyMusic(name:String)
}
//协议可以继承协议(多个)
protocolLoveMusic2:Love,Skill{
funcsongMusic()
varsimpleDescription:String{get}
mutatingfuncmodifyMusic(name:String)
}
//协议的重写
protocolLove{
varname:String{getset}
}
protocolSkill{
varname:String{getset}
}
//我们重写协议中的属性,让其只要get方法即可
protocolLoveMusic3:Love{
funcsongMusic()
varsimpleDescription:String{get}
mutatingfuncmodifyMusic(name:String)
}
//可以实现多个协议
classStudent:Love,Skill{
internalvarname:String=""
internalfuncmodifyMusic(name:String) {
}
}
//创建一个协议只能被类遵守
protocolMyClassDelegate:class{
funcgetName()
}
classUDP {
weakvardelegate:UDPDelegate?
}
protocolUDPDelegate:class{
}