扩展用于为已存在的类、结构体或枚举等类型添加新的功能,语法格式如下:
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)条腿")
- 扩展下标
扩展可以使用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])")
网友评论