Swift和Object-C协议的区别

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{

}

你可能感兴趣的:(Swift和Object-C协议的区别)