美文网首页
Swift - 扩展

Swift - 扩展

作者: 汪小喵 | 来源:发表于2017-01-13 16:09 被阅读13次

扩展用于为已存在的类、结构体或枚举等类型添加新的功能,语法格式如下:

extension 类型名{
    // 添加的新功能
}

我们知道通过继承也可以为类增加新的功能,但是与继承相比,扩展的功能更加强大,比如一个被定义为final的类,无法通过继承增加新功能,但扩展可以实现。
扩展可以在没有权限获取源代码的情况下扩展类的功能。另外,继承只针对类,不适用于结构体和枚举。
1.扩展计算型属性
我们以Double类型为例,写一个扩展:

extension Double {
    // 计算型属性 km 表示长度单位千米
    var km:Double {
        return self * 1_000.0
    }
    // 计算型属性 m 表示长度单位米
    var m:Double {
        return self
    }
    // 计算型属性 cm 表示长度单位厘米
    var cm:Double {
        return self / 100.0
    }
    // 计算型属性 mm 表示长度单位毫米
    var mm:Double {
        return self / 1_000.0
    }
}
// 定义一个常量 oneKilometer 保存换算后的值
let oneKilometer = 1.km
print("一公里等于\(oneKilometer)米")
// 定义一个常量 tenMillimeter 保存换算后的值
let tenMillimeter = 10.mm
print("10毫米等于\(tenMillimeter)米")
// 通过扩展实现长度单位的计算
let aMarathon = 42.km + 195.m
print("马拉松的长度是\(aMarathon)米")

扩展可以添加计算型属性,但是不可以添加存储型属性,也不可以向已有的属性添加属性观察器

2.扩展构造函数
扩展构造函数就是为一个类添加新的构造函数,还是看代码:

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 {
    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))
print("默认构造函数实例\(defaultRect)")
print("成员级构造函数实例\(memberwiseRect)")
print("扩展构造函数实例\(centerRect)")

3.扩展方法
系统本身没有提供的方法,可以通过扩展给类添加。下面演示为Int类型添加方法:

extension Int {
    static var num : Int = 4 // 腿的个数
    // 定义普通方法 legInt
    func legInt() -> Int {
        return self * Int.num
    }
    // 定义可变方法 legInt1
    mutating func legInt1() {
        self = self * Int.num
    }
}

let cat = 6.legInt()
print("6只猫有\(cat)条腿")
var cat1 = 6
cat1.legInt1()
print("6只猫有\(cat1)条腿")
  1. 扩展下标
    扩展可以使用subscript 关键字想一个已有类型添加新下标。下面给Int类型添加下标,访问指定位数的值:
extension Int {
    subscript(index:Int) -> Int {
        var base = 1
        for _ in 0..<index {
            base *= 10
        }
        return (self / base) % 10
    }
}
print("输出个位的值:\(12345[0])")
print("输出十位的值:\(12345[1])")
print("输出百位的值:\(12345[2])")
print("输出千位的值:\(12345[3])")
print("输出万位的值:\(12345[4])")

相关文章

网友评论

      本文标题:Swift - 扩展

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