美文网首页Swift基础swift基础知识
iOS开发 - 「Swift 学习」Swift 扩展

iOS开发 - 「Swift 学习」Swift 扩展

作者: 俺不是大佬儿 | 来源:发表于2022-04-06 14:26 被阅读0次

    Swift 扩展

    向一个已有的类、结构体或枚举添加新功能的形式就叫扩展
    扩展可以对一个类型添加新的功能,但是不能重写已有的功能

    \color{red}{✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻}
    \color{red}{✻} \color{red}{Swift 扩展可以实现的功能:}
    \color{red}{✻ ☞} \color{orange}{1.添加计算型属性和计算型静态属性;}
    \color{red}{✻ ☞} \color{orange}{2.定义实例方法和类型方法(类方法);}
    \color{red}{✻ ☞} \color{orange}{3.提供新的构造器方法;}
    \color{red}{✻ ☞} \color{orange}{4.定义下标脚本;}
    \color{red}{✻ ☞} \color{orange}{5.定义使用新的嵌套类型;}
    \color{red}{✻ ☞} \color{orange}{6.使得一个已有类型遵循某个协议。}
    \color{red}{✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻✻}

    扩展计算型属性

    扩展可以向已有类型添加计算型实例属性计算型类型属性

    例:通过扩展给Int类型增加2个计算型实例属性并扩展对应功能

    extension Int {
        var addSelf:Int{
            return self + self
        }
        
        var div:Int{
            return self / 5
        }
    }
    

    调用

    let add = 5.addSelf
    print("自增运算后的值:\(add)")
            
    let division = 31.div
    print("除法运算后的商值:\(division)")
    

    调用结果

    自增运算后的值:10
    除法运算后的商值:6
    

    扩展新的构造器

    向已有类型添加新的构造器
    可以实现扩展其它类型时,将自己的定制类型作为构造器参数,或者提供该类型的原始实现中没有包含的额外初始化选项。

    注意:

    扩展可以向类中添加新的便利构造器init(),但是不能向类中添加新的指定构造器析构函数deinit()

    struct summation {
        var num1 = 100, num2 = 200
    }
    
    struct diff{
        var no1 = 200,no2 = 100
    }
    
    struct mult {
        var a = summation()
        var b = diff()
    }
    
    extension mult {
    //扩展新的构造器并将自定义类型summation、diff作为新扩展构造器的参数
        init(x:summation,y:diff){
            
            a.num1 = x.num1
            a.num2 = x.num2
            
            _ = x.num1 + x.num2
            _ = y.no1 + y.no2
        }
    }
    

    调用

    let a = summation(num1: 10, num2: 20)
    let b = diff(no1: 2, no2: 4)
    let getMult = mult(x: a, y: b)
    
    print("getMult sum\((getMult.a.num1, getMult.a.num2))")
    print("getMult diff\((getMult.b.no1, getMult.b.no2))")
    

    调用结果

    getMult sum(10, 20)
    getMult diff(200, 100)
    

    扩展方法

    向已有类型添加新的实例方法和类型方法

    例:以下扩展实例中向Int类型添加了topics实例方法和valueDouble实例方法

    //方法
    extension Int {
        //循环计数
        func topics(summationnnn:()->()) {
            for _ in 0..<self{
                summationnnn()
            }
        }
        //自增方法
        func valueDouble(baseValue:Int) ->Int{
            return baseValue + self;
        }
        
    }
    

    调用

    4.topics {
       print("执行4次")
    }
    
    //相当于计算6+10的结果
    let result = 6.valueDouble(baseValue: 10)
    print("数值增加计算结果:\(result)");
    

    调用结果

    执行4次
    执行4次
    执行4次
    执行4次
    数值增加计算结果:16
    

    扩展可变实例方法

    通过扩展添加的实例方法也可以修改该实例本身
    结构体枚举类型中修改self其属性的方法必须将该实例方法标注为mutating,正如来自原始实现的修改方法一样。

    //可变实例方法
    //为Double类型添加了一个roundSquare的修改方法,实现根据圆半径计算面积的功能
    extension Double {
        mutating func roundSquare(){
            let pi = 3.1415
            //修改self的值,计算圆的面积
            self = pi * self * self
        }
    }
    

    调用

    var rArea = 2.0
    rArea.roundSquare()
    print("半径为2.0的圆形面积:\(rArea)")
            
    var round = 3.0
    round.roundSquare()
    print("半径为3.0的圆形面积:\(round)")
    

    调用结果

    半径为2.0的圆形面积:12.566
    半径为3.0的圆形面积:28.2735
    

    扩展下标脚本

    向一个已有类型添加新下标

    //下标(给Int类型添加了一个整形下标并返回Int型数值)
    extension Int {
        subscript(multtable:Int) -> Int {
            var num = 1
            var tempMulttable = multtable
            while tempMulttable > 0{
                num *= 2
                tempMulttable -= 1
            }
            return(self / num) % 10
        }
    }
    

    调用

    let num = 30[3]
    print("扩展下标\(num)")
    

    调用结果

    扩展下标3
    

    扩展嵌套类型

    向已有类、结构体、枚举添加新的嵌套类型

    extension Int {
    
        enum calc
        {
            case add
            case sub
            case anything
        }
        
        var print:calc {
            switch self{
            case 0:
                return .add
            case 1:
                return .sub
            default:
                return .anything
            }
        }
    }
    //参数是Int型数组
    func nestedResult(numArr:[Int]){
        for i in numArr {
            switch i.print{
            case .add:
                print("10")
            case .sub:
                print("20")
            default:
                print("300")
            }
        }
    }
    

    调用

    nestedResult(numArr: [1,2,3])
    

    调用结果

    20
    300
    300
    

    \color{gray}{欢迎大佬儿来指正纠错,共同学习😏!!}

    相关文章

      网友评论

        本文标题:iOS开发 - 「Swift 学习」Swift 扩展

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