在学习swift时 发现Any定义如下
public typealias Any =protocol<>
发现了这个东东 protocol<> 学习一通后特来总结下:
protocol<>是什么意思呢? 简单的说是”实现空接口“,其实就是任意接口,
protocol<>的标准形式其实这样的
protocol<Protocol1,Protocol2,Protocol3>
尖括号内就是具体事实现的接口,整体表达的就是匿名接口。
上面的写法等价于:
protocol ProtocolD4:Protocol1,Protocol2,Protocol3 {
}
具体用法下面我举个比较简单的例子:
protocol KittenLike {
func meow() -> String
}
protocol DogLike {
func bark() -> String
}
typealias PetLike = protocol<KittenLike,DogLike>
struct SoundChecker {
static func checkPetTalking(pet:PetLike) {
}
}
或者:
struct SoundChecker {
static func checkPetTalking(pet:protocol<KittenLike,DogLike>) {
}
}
是不是表达上很清晰. 使用者一眼就可以知道 pet的定义及需要实现哪些protocol,
这样一来 我们就不需要自己定义个protocol。只需要定义一个匿名的protocol 让别人实现就好。
下面说一个比较特殊的例子:
protocol A {
func play() -> String
}
protocol B {
func play() -> Int
}
struct C : A ,B {
func play() -> String {
}
func play() -> String {
}
}
let c = C()
A B有个相同名称的方法play 只是返回值不同,这时候C同时实现了A,B
那么就会出现调用冲突,
c.play() 调用的是A还是B的方法
为了避免冲突,我们可以使用下面的方法避免这种冲突
(c instance A).play()
(c instance B),play()
调用前类型转换