swift 分类和嵌套类型

862 阅读2分钟

这是我参与更文挑战的第21天,活动详情查看: 更文挑战

扩展

为一个已有的类、结构体、枚举类型或者协议类型添加新功能

注意:

  • 扩展可以向类型添加新功能,但它们不能覆盖现有功能
  • 与 Object-C 不同,在 Swift 中的扩展是没有扩展名字的

扩展的语法

使用关键字extension来声明

extension SomeType {
   // 为 SomeType 添加的新功能写到这里
}

扩展的运用

添加属性

为已有类型添加新的计算型属性和实例属性,但是不可以添加存储型属性

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 }
}

let oneInch = 25.4.mm
print("One inch is \(oneInch) meters") 

log:
One inch is 0.0254 meters

添加初始化方法

为已有类型添加新的便利构造器,不能为类添加新的指定构造器或析构器,指定的构造器和析构器必须始终由原始类实现提供

class ClassA{
    var a = 0
    var b = 0
    init(a:Int,b:Int) {
        print("a = \(a),b = \(b)")
    }
}

let a = ClassA.init(a: 2, b: 2)

extension ClassA{
    convenience init(a:Int,b:Int,c:Int) {
        self.init(a:a,b:b)
        print("a = \(a),b = \(b),c = \(c)")
    }
}
let aa = ClassA.init(a: 1, b: 2, c: 3)

log:
a = 2,b = 2
a = 1,b = 2
a = 1,b = 2,c = 3

添加方法

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

class ClassA{
    var a = 0
    var b = 0
    init(a:Int,b:Int) {
        self.a = a
        self.b = b
    }
}
extension ClassA{
    func sum() -> Int {
        return a + b
    }
}
let a = ClassA.init(a: 2, b: 3)
print(a.sum())

log:
5

添加下标

为已有类型添加新的下标

class Students {
    var names: [String] = {
        return ["李雷", "韩梅梅"]
    }()
}

extension Students {
    subscript(index: Int) -> String {
        return names[index]
    }
}

let students = Students()
let name = students.names[0]
let name2 = students[0]

嵌套类型

  • 嵌套类型:一个类型中嵌套定义另一个类型
class Student{
    var name:String
    var hobby:Hobby
    
    enum Hobby {
        case Run,Swim,playFootball
    }
    
    init(name:String, hobby:Hobby) {
        self.name = name
        self.hobby = hobby
    }
}
  • 引用嵌套类型
let student = Student.init(name: "李雷", hobby: Student.Hobby.playFootball)
print(student.hobby)

log:
playFootball