Swift extension
Extensions in Swift can:
- Add computed instance properties and computed type properties
- Define instance methods and type methods
- Provide new initializers
- Define subscripts
- Define and use new nested types
- Make an existing type conform to a protocol
1 - 4, 统一表示可以添加方法, 属性等
5, 可以定义一些嵌套的类型
6, 给当前类型实现一些新的协议
下面这部分代码包含了 1 - 6 的具体实现, 具体就不说了
struct A {}
struct B {
func run() {
print("run")
}
}
protocol C {
func ccc()
}
extension A: C {
static var b = B()
var bb: B {
get {
Self.b
}
set {
Self.b = newValue
}
}
func run() {
Self.b.run()
}
static func run() {
b.run()
}
init(b: B) {
Self.b = b
}
struct AA {}
func ccc() {
}
}
print(A.b.run())
Swift extension 包含泛型的类型 where 判断 T 是否实现某个协议
struct K: Print {
func print() {
Swift.print("KKKKKK")
}
}
struct KK {}
struct B<T> {
var t: T
init(t: T) {
self.t = t
}
}
extension B where T: Print {
func printT() {
self.t.print()
}
}
let b = B(t: KK())
let b1 = B(t: K())
b1.printT()
如上代码, 只有传入的 T 实现了 Print 协议, B才包含 printT() 方法.
当传入的是 KK() 时, 则无法调用 printT()
这里判断 T 是否实现某个协议使用的是 :
Swift extension 包含泛型的类型 where 判断 T 是否是某个类型
struct B<T> {
var t: T
init(t: T) {
self.t = t
}
}
class CC {}
class CCC: CC {}
extension B where T == CC {
func printT() {
print("CCC")
}
}
let b2 = B(t: CC())
b2.printT()
判断 T 是否是某个类型用 ==
, ==
判断的是绝对的类型, T == CC, 即使你传入的是该类型的子类也不可以, let b2 = B(t: CCC())
, b2 是没有 printT() 方法的.
protocol extension
- 添加协议中方法的默认实现
- 添加一些新的方法或者属性并实现, 和其他的扩展相比, 不可以添加新的协议的继承, 不可以定义一些嵌套的类型.
- 给这个协议添加一些约束, 如下代码, 只有当泛型 Element 实现了
Equatable
协议, 才给Collection
协议, 添加allEqual()
方法
extension Collection where Element: Equatable {
func allEqual() -> Bool {
for element in self {
if element != self.first {
return false
}
}
return true
}
}
- 关于 where 后面加的是
==
类型判断的是使用, 和上面的extension
中介绍的相同
主要是协议中定义的泛型的类型约束, 可以使用:
来进行协议的约束, 使用==
来进行具体类型的约束
网友评论