- 扩展是为了向现有的类别、结构或枚举类型添加新的功能,扩展可以为一种类型添加新的功能,但不能重写现有的功能。
- Swift 中间扩展可以:
-
-
-
-
-
-
- 扩展声明使用关键字 extension:
extension SomeType {
// 加到SomeType新功能写在这里 }
extension SomeType: SomeProtocol, AnotherProctocol {
// 协议实现写在这里 }
- 可将计算型实例属性和计算型类型属性添加到现有类型中。
- 如下所示,方向 Int 类型添加了 5 个计算型实例属性并扩展其功能:
extension Int {
var add: Int {
return self 100 } var sub: Int {
return self - 10 } var mul: Int {
return self * 10 } var div: Int {
return self / 5 } } let addition = 3.add print("加法操作后的值:\(addition)") let subtraction = 120.sub print("减法后的值:\(subtraction)") let multiplication = 39.mul
print
(
"乘法运算后的值:\(multiplication)"
)
let division
=
55
.div
print
(
"除法运算后的值: \(division)"
)
let mix
=
30
.add
+
34
.sub
print
(
"混合运算结果:\(mix)"
)
加法运算后的值:103
减法运算后的值:110
乘法运算后的值:390
除法运算后的值: 11
混合运算结果:154
struct sum {
var num1 = 100, num2 = 200
}
struct diff {
var no1 = 200, no2 = 100
}
struct mult {
var a = sum()
var b = diff()
}
extension mult {
init(x: sum, y: diff) {
_ = x.num1 + x.num2
_ = y.no1 + y.no2
}
}
let a = sum(num1: 100, num2: 200)
let b = diff(no1: 200, no2: 100)
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)")
getMult sum(100, 200)
getMult diff(200, 100)
- 扩展可以向已有类型添加新的实例方法和类型方法。
- 向 Int 类型添加一个名为 topics 的新实例方法,如下所示:
extension Int {
func topics(summation: () -> ()) {
for _ in 0..<self {
summation()
}
}
}
4.topics({
print("扩展模块内")
})
3.topics({
print("内型转换模块内")
})
扩展模块内
扩展模块内
扩展模块内
扩展模块内
内型转换模块内
内型转换模块内
内型转换模块内
- 这个 topics 方法使用了一个() -> ()类型的单参数,表明函数没有参数而且没有返回值。
- 定义该扩展之后,就可以对任意整数调用 topics 方法,实现的功能则是多次执行某任务:
- 通过扩展添加的实例方法也可以修改该实例本身。
- 结构体和枚举类型中修改 self 或其属性的方法必须将该实例方法标注为 mutating,正如来自原始实现的修改方法一样。
- 向 Swift 的 Double 类型添加了一个新的名为 square 的修改方法,来实现一个原始值的平方计算:
extension Double {
mutating func square() {
let pi = 3.1415
self = pi * self * self
}
}
var Trial1 = 3.3
Trial1.square()
print("圆的面积为: \(Trial1)")
var Trial2 = 5.8
Trial2.square()
print("圆的面积为: \(Trial2)")
var Trial3 = 120.3
Trial3.square()
print("圆的面积为: \(Trial3)")
圆的面积为: 34.210935
圆的面积为: 105.68006
圆的面积为: 45464.070735
- 扩展可以向一个已有类型添加新下标。
- 向 Swift 内建类型Int添加了一个整型下标,该下标[n]返回十进制数字:
extension Int {
subscript(var multtable: Int) -> Int {
var no1 = 1
while multtable > 0 {
no1 *= 10
--multtable
}
return (self / no1) % 10
}
}
print(12[0])
print(7869[1])
print(786543[2])
2
6
5
- 扩展可以向已有的类、结构体和枚举添加新的嵌套类型:
extension Int {
enum calc
{
case add
case sub
case mult
case div
case anything
}
var print: calc {
switch self
{
case 0:
return .add
case 1:
return .sub
case 2:
return .mult
case 3:
return .div
default:
return .anything
}
}
}
func result(numb: [Int]) {
for i in numb {
switch i.print {
case .add:
print(" 10 ")
case .sub:
print(" 20 ")
case .mult:
print(" 30 ")
case .div:
print(" 40 ")
default:
print(" 50 ")
}
}
}
result([0, 1, 2, 3, 4, 7])
10
20
30
40
50
50