• 望其项背 iOS


    项目地址 https://github.com/webabcd/IosDemo
    作者 webabcd

    望其项背 iOS - swift: extension 扩展:为指定类型扩充新的属性,方法,下标,协议实现,嵌套类型,为指定结构体扩充新的初始化器,为指定类扩充新的初始化器,为指定类型新增泛型的类型约束(通过 where : 约束泛型属于某个类或某个协议,通过 where == 约束泛型属于某个值类型),为指定协议扩充新的逻辑(所有实现此协议的类型,都会自动扩充此处的新逻辑)

    示例如下:

    SwiftView14.swift

    /*
     * 本例用于演示 extension 扩展
     * 为指定类型扩充新的属性,方法,下标,协议实现,嵌套类型,为指定结构体扩充新的初始化器,为指定类扩充新的初始化器,为指定类型新增泛型的类型约束(通过 where : 约束泛型属于某个类或某个协议,通过 where == 约束泛型属于某个值类型),为指定协议扩充新的逻辑(所有实现此协议的类型,都会自动扩充此处的新逻辑)
     *
     * 注:extension 用于扩充某类型的功能,但是不能扩充新的可保存的属性,也不能 override 已有功能
     */
    
    import SwiftUI
    
    struct SwiftView14: View {
        
        var result: String = ""
        
        init() {
            result = sample1() // 为指定类型扩充新的属性,方法,下标
            result += "
    "
            result += sample2() // 为指定类型扩充新的协议实现,嵌套类型,为指定结构体扩充新的初始化器
            result += "
    "
            result += sample3() // 为指定类型新增泛型的类型约束(通过 where : 约束泛型属于某个类或某个协议,通过 where == 约束泛型属于某个值类型),为指定类扩充新的初始化器
            result += "
    "
            result += sample4() // 为指定协议扩充新的逻辑(所有实现此协议的类型,都会自动扩充此处的新逻辑)
        }
    
        var body: some View {
            VStack {
                HStack {
                    Text(result)
                    Spacer()
                }
                Spacer()
            }
        }
        
        func sample1() -> String {
            let a = 3.14
            let b = a.intValue // 3
            let c = a.toInt() // 3
            let d = a[2] // 6
            
            return "(b), (c), (d)"
        }
    
        func sample2() -> String {
            let a = SwiftView14_Struct1(age: 40)
            let b = a.name
            let c = a.getMessage()
            let d = a.getMyEnum()
            
            return "(b), (c), (d)"
        }
        
        func sample3() -> String {
            let a = SwiftView14_Class1<String>(name: "webabcd")
            let b = a.name
            let c = a.age
            
            return "(b), (c)"
        }
        
        func sample4() -> String {
            let a = SwiftView14_Class2(name: "webabcd")
            let b = a.getMessage()
            
            return "(b)"
        }
    }
    
    
    // 通过 extension 为指定类型扩充新的属性,方法,下标
    extension Double {
        var intValue: Int {
            return Int(self)
        }
        
        func toInt() -> Int {
            return Int(self)
        }
        
        subscript(a: Int) -> Int {
            return Int(self) * a
        }
    }
    
    
    protocol SwiftView14_Protocol1 {
        func getMessage() -> String
    }
    struct SwiftView14_Struct1 {
        var name: String = "webabcd"
    }
    // 通过 extension 为指定类型扩充新的协议实现,嵌套类型,为指定结构体扩充新的初始化器
    extension SwiftView14_Struct1: SwiftView14_Protocol1 { // 扩充新的协议实现
        init(age: Int) { // 为结构体扩充新的初始化器(为类扩充新的初始化器会有一些不一样,后面会说)
            self.name = "(self.name) (age)"
        }
        
        func getMessage() -> String {
            return self.name
        }
        
        func getMyEnum() -> MyEnum {
            return .e1
        }
        enum MyEnum { // 扩充新的嵌套类型
            case e1, e2, e3
        }
        
        // 注:不能扩充新的可保存的属性,比如下面这句会报错 Extensions must not contain stored properties
        // var xxx = 100
    }
    
    
    class SwiftView14_Class1<T> {
        var name: T
        var age: Int
        init(name: T, age: Int) {
            self.name = name
            self.age = age
        }
    }
    // 通过 extension 为指定类型新增泛型的类型约束(通过 where : 约束泛型属于某个类或某个协议),为指定类扩充新的初始化器
    extension SwiftView14_Class1 where T: Equatable {
        // 注:不能扩充新的可保存的属性,比如下面这句会报错 Extensions must not contain stored properties
        // var xxx = 100
    
        convenience init(name: T) { // 为类扩充新的初始化器
            // 注意:这里访问不了 self.name 之类的(extension 结构体是可以的),只能调用 self.init(),所以 init() 要用 convenience 修饰
            self.init(name: name, age: 100)
        }
    }
    // 通过 extension 为指定类型新增泛型的类型约束(通过 where == 约束泛型属于某个值类型)
    extension SwiftView14_Class1 where T == String {
    
    }
    
    
    protocol SwiftView14_Protocol2 {
        var name: String { get set }
    }
    struct SwiftView14_Class2: SwiftView14_Protocol2 {
        var name: String
    }
    // 通过 extension 为指定协议扩充新的逻辑(所有实现此协议的类型,都会自动扩充此处的新逻辑)
    // 也就是说通过此方式可以在协议中实现具体逻辑,而在协议定义中是做不到这一点的
    extension SwiftView14_Protocol2 {
        func getMessage() -> String {
            return self.name
        }
    }
    
    

    项目地址 https://github.com/webabcd/IosDemo
    作者 webabcd

  • 相关阅读:
    为《理解C#中的System.In32和int:并非鸡和鸡蛋 》做个续
    Windows C++代码heap分析详解
    Windows 内存分析之路 How to use Resource Monitor
    给C++初学者的50个忠告(好文转载)
    The 32bit generalpurpose registers EAX, EBX, ECX, EDX, ESI, EDI, EBP, and ESP
    Exceptional C++ 精华代码—实现异常安全的Stack
    Windows开发的内功和招式
    Windows代码heap内存分析实战
    十分钟让你对C++ Traits大彻大悟
    使用Windows API PostThreadMessage进行线程间消息通信
  • 原文地址:https://www.cnblogs.com/webabcd/p/ios_SwiftView14.html
Copyright © 2020-2023  润新知