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