Swift基础swift基础知识

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

2022-04-06  本文已影响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}{欢迎大佬儿来指正纠错,共同学习😏!!}

上一篇下一篇

猜你喜欢

热点阅读