美文网首页Swift 基础
Swift extension 和 protocol exten

Swift extension 和 protocol exten

作者: 幸运者_Lucky | 来源:发表于2020-07-27 18:45 被阅读0次

    Swift extension

    Extensions in Swift can:

    1. Add computed instance properties and computed type properties
    2. Define instance methods and type methods
    3. Provide new initializers
    4. Define subscripts
    5. Define and use new nested types
    6. 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

    1. 添加协议中方法的默认实现
    2. 添加一些新的方法或者属性并实现, 和其他的扩展相比, 不可以添加新的协议的继承, 不可以定义一些嵌套的类型.
    3. 给这个协议添加一些约束, 如下代码, 只有当泛型 Element 实现了 Equatable 协议, 才给 Collection 协议, 添加 allEqual() 方法
    extension Collection where Element: Equatable {
        func allEqual() -> Bool {
            for element in self {
                if element != self.first {
                    return false
                }
            }
            return true
        }
    }
    
    1. 关于 where 后面加的是 == 类型判断的是使用, 和上面的 extension 中介绍的相同
      主要是协议中定义的泛型的类型约束, 可以使用 : 来进行协议的约束, 使用 == 来进行具体类型的约束

    相关文章

      网友评论

        本文标题:Swift extension 和 protocol exten

        本文链接:https://www.haomeiwen.com/subject/qoqtrktx.html