Swift 扩展
向一个已有的类、结构体或枚举添加新功能的形式就叫扩展
扩展可以对一个类型添加新的功能,但是不能重写已有的功能
扩展计算型属性
扩展可以向已有类型添加计算型实例属性
和计算型类型属性
例:通过扩展给Int类型增加2个计算型实例属性并扩展对应功能
extension Int {
var addSelf:Int{
return self + self
}
var div:Int{
return self / 5
}
}
调用
let add = 5.addSelf
print("自增运算后的值:\(add)")
let division = 31.div
print("除法运算后的商值:\(division)")
调用结果
自增运算后的值:10
除法运算后的商值:6
扩展新的构造器
向已有类型添加新的构造器
可以实现扩展其它类型时,将自己的定制类型作为构造器参数,或者提供该类型的原始实现中没有包含的额外初始化选项。
注意:
扩展可以向类中添加新的便利构造器init()
,但是不能
向类中添加新的指定构造器
或析构函数deinit()
。
struct summation {
var num1 = 100, num2 = 200
}
struct diff{
var no1 = 200,no2 = 100
}
struct mult {
var a = summation()
var b = diff()
}
extension mult {
//扩展新的构造器并将自定义类型summation、diff作为新扩展构造器的参数
init(x:summation,y:diff){
a.num1 = x.num1
a.num2 = x.num2
_ = x.num1 + x.num2
_ = y.no1 + y.no2
}
}
调用
let a = summation(num1: 10, num2: 20)
let b = diff(no1: 2, no2: 4)
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(10, 20)
getMult diff(200, 100)
扩展方法
向已有类型添加新的实例方法和类型方法
例:以下扩展实例中向Int类型添加了topics实例方法和valueDouble实例方法
//方法
extension Int {
//循环计数
func topics(summationnnn:()->()) {
for _ in 0..<self{
summationnnn()
}
}
//自增方法
func valueDouble(baseValue:Int) ->Int{
return baseValue + self;
}
}
调用
4.topics {
print("执行4次")
}
//相当于计算6+10的结果
let result = 6.valueDouble(baseValue: 10)
print("数值增加计算结果:\(result)");
调用结果
执行4次
执行4次
执行4次
执行4次
数值增加计算结果:16
扩展可变实例方法
通过扩展添加的实例方法也可以修改该实例本身
结构体
和枚举类型
中修改self
或其属性
的方法必须将该实例方法标注为mutating
,正如来自原始实现的修改方法一样。
//可变实例方法
//为Double类型添加了一个roundSquare的修改方法,实现根据圆半径计算面积的功能
extension Double {
mutating func roundSquare(){
let pi = 3.1415
//修改self的值,计算圆的面积
self = pi * self * self
}
}
调用
var rArea = 2.0
rArea.roundSquare()
print("半径为2.0的圆形面积:\(rArea)")
var round = 3.0
round.roundSquare()
print("半径为3.0的圆形面积:\(round)")
调用结果
半径为2.0的圆形面积:12.566
半径为3.0的圆形面积:28.2735
扩展下标脚本
向一个已有类型添加新下标
//下标(给Int类型添加了一个整形下标并返回Int型数值)
extension Int {
subscript(multtable:Int) -> Int {
var num = 1
var tempMulttable = multtable
while tempMulttable > 0{
num *= 2
tempMulttable -= 1
}
return(self / num) % 10
}
}
调用
let num = 30[3]
print("扩展下标\(num)")
调用结果
扩展下标3
扩展嵌套类型
向已有类、结构体、枚举添加新的嵌套类型
extension Int {
enum calc
{
case add
case sub
case anything
}
var print:calc {
switch self{
case 0:
return .add
case 1:
return .sub
default:
return .anything
}
}
}
//参数是Int型数组
func nestedResult(numArr:[Int]){
for i in numArr {
switch i.print{
case .add:
print("10")
case .sub:
print("20")
default:
print("300")
}
}
}
调用
nestedResult(numArr: [1,2,3])
调用结果
20
300
300