iOS開發(fā) - 「Swift 學(xué)習(xí)」Swift 擴展

Swift 擴展

向一個已有的類、結(jié)構(gòu)體或枚舉添加新功能的形式就叫擴展
擴展可以對一個類型添加新的功能,但是不能重寫已有的功能

\color{red}{????????????????????????????????}
\color{red}{?} \color{red}{Swift 擴展可以實現(xiàn)的功能:}
\color{red}{? ?} \color{orange}{1.添加計算型屬性和計算型靜態(tài)屬性;}
\color{red}{? ?} \color{orange}{2.定義實例方法和類型方法(類方法);}
\color{red}{? ?} \color{orange}{3.提供新的構(gòu)造器方法;}
\color{red}{? ?} \color{orange}{4.定義下標(biāo)腳本;}
\color{red}{? ?} \color{orange}{5.定義使用新的嵌套類型;}
\color{red}{? ?} \color{orange}{6.使得一個已有類型遵循某個協(xié)議。}
\color{red}{????????????????????????????????}

擴展計算型屬性

擴展可以向已有類型添加計算型實例屬性計算型類型屬性

例:通過擴展給Int類型增加2個計算型實例屬性并擴展對應(yīng)功能

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

調(diào)用

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

調(diào)用結(jié)果

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

擴展新的構(gòu)造器

向已有類型添加新的構(gòu)造器
可以實現(xiàn)擴展其它類型時,將自己的定制類型作為構(gòu)造器參數(shù),或者提供該類型的原始實現(xiàn)中沒有包含的額外初始化選項。

注意:

擴展可以向類中添加新的便利構(gòu)造器init(),但是不能向類中添加新的指定構(gòu)造器析構(gòu)函數(shù)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 {
//擴展新的構(gòu)造器并將自定義類型summation、diff作為新擴展構(gòu)造器的參數(shù)
    init(x:summation,y:diff){
        
        a.num1 = x.num1
        a.num2 = x.num2
        
        _ = x.num1 + x.num2
        _ = y.no1 + y.no2
    }
}

調(diào)用

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))")

調(diào)用結(jié)果

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

擴展方法

向已有類型添加新的實例方法和類型方法

例:以下擴展實例中向Int類型添加了topics實例方法和valueDouble實例方法

//方法
extension Int {
    //循環(huán)計數(shù)
    func topics(summationnnn:()->()) {
        for _ in 0..<self{
            summationnnn()
        }
    }
    //自增方法
    func valueDouble(baseValue:Int) ->Int{
        return baseValue + self;
    }
    
}

調(diào)用

4.topics {
   print("執(zhí)行4次")
}

//相當(dāng)于計算6+10的結(jié)果
let result = 6.valueDouble(baseValue: 10)
print("數(shù)值增加計算結(jié)果:\(result)");

調(diào)用結(jié)果

執(zhí)行4次
執(zhí)行4次
執(zhí)行4次
執(zhí)行4次
數(shù)值增加計算結(jié)果:16

擴展可變實例方法

通過擴展添加的實例方法也可以修改該實例本身
結(jié)構(gòu)體枚舉類型中修改self其屬性的方法必須將該實例方法標(biāo)注為mutating,正如來自原始實現(xiàn)的修改方法一樣。

//可變實例方法
//為Double類型添加了一個roundSquare的修改方法,實現(xiàn)根據(jù)圓半徑計算面積的功能
extension Double {
    mutating func roundSquare(){
        let pi = 3.1415
        //修改self的值,計算圓的面積
        self = pi * self * self
    }
}

調(diào)用

var rArea = 2.0
rArea.roundSquare()
print("半徑為2.0的圓形面積:\(rArea)")
        
var round = 3.0
round.roundSquare()
print("半徑為3.0的圓形面積:\(round)")

調(diào)用結(jié)果

半徑為2.0的圓形面積:12.566
半徑為3.0的圓形面積:28.2735

擴展下標(biāo)腳本

向一個已有類型添加新下標(biāo)

//下標(biāo)(給Int類型添加了一個整形下標(biāo)并返回Int型數(shù)值)
extension Int {
    subscript(multtable:Int) -> Int {
        var num = 1
        var tempMulttable = multtable
        while tempMulttable > 0{
            num *= 2
            tempMulttable -= 1
        }
        return(self / num) % 10
    }
}

調(diào)用

let num = 30[3]
print("擴展下標(biāo)\(num)")

調(diào)用結(jié)果

擴展下標(biāo)3

擴展嵌套類型

向已有類、結(jié)構(gòu)體、枚舉添加新的嵌套類型

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
        }
    }
}
//參數(shù)是Int型數(shù)組
func nestedResult(numArr:[Int]){
    for i in numArr {
        switch i.print{
        case .add:
            print("10")
        case .sub:
            print("20")
        default:
            print("300")
        }
    }
}

調(diào)用

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

調(diào)用結(jié)果

20
300
300

\color{gray}{歡迎大佬兒來指正糾錯,共同學(xué)習(xí)???。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容