iOS學習筆記46-Swift(六)擴展

1、Swift擴展

擴展就是向一個已有的類、結構體或枚舉類型添加新功能,這包括在沒有權限獲取原始源代碼的狀況下擴展類型的能力。
擴展和 Objective-C中的分類(category)相似,可是它要比分類強大的多,它不只能夠擴展類,還能夠擴展協議、枚舉、結構體,另外擴展也不侷限於擴展方法,還能夠擴展便利構造方法、計算屬性、下標腳本等php

Swift中的擴展能夠:
  1. 添加計算屬性和計算靜態屬性
  2. 添加實例方法和類型方法
  3. 提供新的構造器
  4. 添加下標腳本
  5. 定義和使用新的嵌套類型
//使用擴展須要使用到extension關鍵字,這裏的SomeType能夠是類、結構體、枚舉、協議等類型
extension SomeType{
    //添加到SomeType的新功能寫在這裏
}
//一個擴展能夠擴展一個已有類型,使其可以適配一個或多個協議
extension SomeType: SomeProtocol, AnotherProctocol {
    // 協議實現寫到這裏
}
1. 擴展屬性(只能是計算屬性)
//擴展系統結構體Double,添加計算屬性
extension Double {
    var km: Double { return self * 1_000.0 } //計算只讀屬性的簡化寫法
    var m : Double { return self }
    var cm: Double { return self / 100.0 }
    var mm: Double { return self / 1_000.0 }
    var ft: Double { return self / 3.28084 }
}
var inch:Double = 25.4
let oneInch = inch.mm
print("One inch is \(oneInch) meters")
// 打印輸出:One inch is 0.0254 meters
var feet:Double = 3.0
let threeFeet = feet.ft
print("Three feet is \(threeFeet) meters")
// 打印輸出:Three feet is 0.914399970739201 meters

注意:
擴展能夠添加新的計算屬性,可是不能夠添加存儲屬性,也不能夠向已有屬性添加屬性觀測器。git

2. 擴展實例方法和類型方法
//向Int類型添加一個名爲repetitions的新實例方法,接受一個空參數無返回值的函數類型參數
extension Int {
    func repetitions(task: () -> ()) {
        //重複執行自己值次數的函數
        for _ in 0..<self {
            task()
        }
    }
    //擴展類型方法
    static func number()->[Int]{
        return [1, 2, 3]
    }
}
var value:Int = 3
value.repetitions({
    print("Hello World")
})
/* 打印:
Hello World
Hello World
Hello World
*/
value.repetitions{//尾閉包簡化
    print("extension")
}
/* 打印:
extension
extension
extension
*/
print(Int.number())//打印:[1, 2, 3]
3. 擴展構造器
//定義一個類
class Person {
    var firstName:String
    var lastName:String
    var age:Int = 0
    var fullName:String{
        get{
            return firstName + " " + lastName
        }
    }
    init(firstName:String, lastName:String){
        self.firstName = firstName
        self.lastName = lastName
    }
}
//擴展該類,擴展便利構造器方法
extension Person{
    //類類型只能擴展便利構造方法,不能擴展指定構造方法
    convenience init(){
        self.init(firstName:"", lastName:"")
    }
}
var p = Person()
p.firstName = "Liu"
p.lastName = "Ting"
p.age = 22
print(p.fullName) //打印:Liu Ting
/* 擴展結構體 */
struct Size {
    var width = 0.0, height = 0.0
}
struct Point {
    var x = 0.0, y = 0.0
}
struct Rect {
    var origin = Point()
    var size = Size()
}
//默認構造器方法
let defaultRect = Rect()
//成員逐一構造器方法
let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0),
                            size: Size(width: 5.0, height: 5.0))
//擴展結構體
extension Rect {
    //這個新的構造器會根據提供的center和size值計算一個合適的原點。
    init(center: Point, size: Size) {
        let originX = center.x - (size.width / 2)
        let originY = center.y - (size.height / 2)
        //調用成員逐一構造器
        self.init(origin: Point(x: originX, y: originY), 
                    size: size)
    }
}
let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
                        size: Size(width: 3.0, height: 3.0))
// centerRect的原點是 (2.5, 2.5),大小是 (3.0, 3.0)
  1. 類類型只能擴展便利構造方法,不能擴展指定構造方法
  2. 值類型擴展指定構造方法訪問默認構造方法和成員逐一構造器的條件是:
  • 保證存儲屬性都有值(通常須要調用默認構造方法或成員逐一構造方法)
  • 在源類型中沒有定義該指定構造器方法
4. 擴展下標腳本
//爲系統類型Int添加擴展
extension Int {
    //擴展下標腳本,獲取對應下標位數的數字
    subscript(digitIndex: Int) -> Int {
        var decimalBase = 1
        for _ in 0..<digitIndex {
            decimalBase *= 10
        }
        return (self / decimalBase) % 10
    }
}
var value:Int = 1234567
print(value[0]) //結果:7
print(value[1]) //結果:6
print(value[2]) //結果:5
print(value[3]) //結果:4
5. 擴展嵌套類型
//爲系統類型Character添加擴展
extension Character {
    //擴展嵌套類型,表示元音、輔音、其餘
    enum Kind {
        case Vowel, Consonant, Other
    }
    //擴展計算屬性
    var kind: Kind {
        //轉爲小寫後進行元輔音匹配
        switch String(self).lowercaseString {
            case "a", "e", "i", "o", "u":
                return .Vowel
            case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
                 "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
                return .Consonant
            default:
                return .Other
        }
    }
}
var word = "Hello"
//遍歷字符串的全部字符
for character in word.characters {
    switch character.kind {
        case .Vowel: //由於kind屬性指定了類型,是Character.Kind.Vowel的簡化
            print("\(character)是元音")
        case .Consonant:
            print("\(character)是輔音")
        case .Other:
            print("\(character)是其餘")
    }
}
/* 打印:
H是輔音
e是元音
l是輔音
l是輔音
o是元音
*/

靈活使用Swift的擴展,能夠提升咱們的編碼效率,就像咱們在OC中積累項目經驗,有一些東西會已分類的形式進行積累,能夠方便咱們移植到其餘項目中,提升咱們的效率,Swift擴展就是比這個更增強大的存在,沒理由不用編程

提供一個好用的在線Swift編譯網站:Swift在線編程swift

有什麼問題能夠在下方評論區中提出!O(∩_∩)O哈!
相關文章
相關標籤/搜索