Swift之协议
2019-07-31 本文已影响0人
JerrySi
协议的概念没有什么好说的,作用和OC中也类似,但是用法比OC多变。
- associatedtype
被associatedtype关键字修饰的变量,相当于一个占位符,而不能表示具体的类型,具体的类型需要让实现的类来指定。
用法如下,实现协议的不同结构体可以传递不同类型的参数:
protocol TestProtocol {
associatedtype E
func doSomething(_ parameter: E)
}
struct TestStruct1: TestProtocol {
func doSomething(_ parameter: String) {
/***/
}
}
struct TestStruct2: TestProtocol {
func doSomething(_ parameter: Array<Any>) {
/***/
}
}
这里有一个问题为什么不用<T>来实现,这里有一篇文章说明了这个问题:https://www.jianshu.com/p/ef4a9b56f951。但是很遗憾,针对这个文章说明的,我看的云里雾里,如果有哪位知晓,望不吝告知。
- where
协议还可以结合where来使用,来控制使用范围。
protocol TestProtocol where E == String, Self: UIView {
associatedtype E
func doSomething(_ parameter: E)
}
class TestStruct1: UIView, TestProtocol {
typealias E = String
func doSomething(_ parameter: E) {
/***/
}
}
这里对协议限制了2个使用范围:关联类型必须是String,只有UIView和其子类才能实现。
细心的人应该发现了where的2种用法:where == T 和 where: T
where == T是特定T类型扩展
where: T是符合特定协议或继承指定类的类型编写扩展
另外发现基本类型只能使用 == ,比如[String]、String等