Swift开发实战

protocol组合

2015-09-23  本文已影响99人  sprint

在学习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()

调用前类型转换

上一篇 下一篇

猜你喜欢

热点阅读