Swift之协议

2019-07-31  本文已影响0人  JerrySi

协议的概念没有什么好说的,作用和OC中也类似,但是用法比OC多变。

  1. 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。但是很遗憾,针对这个文章说明的,我看的云里雾里,如果有哪位知晓,望不吝告知。

  1. 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等

上一篇下一篇

猜你喜欢

热点阅读