扩展
关键字extension,扩展的目的就是衍生原来没有的功能,可以扩展属性、方法、索引。并且可以在没有获得原始代码的情况下扩展。在oc中是以runtime来实现动态调用和添加功能的。
现有的类、结构体、枚举可以在扩展的方式下添加方法,但重写的方法不能使用扩展。
属性扩展
extension Double{
var q:Double{
return self/1000}
var w:Double{
return self/10000}
}
override func viewDidLoad() {
super.viewDidLoad()
var xiaoMing = Student()
var xiaoHong = Student()
xiaoMing.name = "xiaoMing"
xiaoHong.name = "xiaoHong"
xiaoMing.balance = 900
xiaoHong.balance = 10200
print("xiaoMing余额:\(xiaoMing.balance.q)千\nxiaoHong余额:\(xiaoHong.balance.w)万")
}
方法扩展
使用方法扩展需要用到extension和mutating两个关键字。
mutating的意思是改变,如果不加这个关键字是不允许对自身的值self进行修改的,只有加上mutating,下方的方法lifang3()才成立,因为lifang3()对self的值进行了修改。
不过不修改self的值,其扩展方法中的mutating可以不加。如下方案例的lifang3return()。
extension Double{
var pingfang2:Double{
return self*self
}
mutating func lifang3() {
self = self*self*self
}
func lifang3return() -> Double {
return self*self*self
}
}
override func viewDidLoad() {
super.viewDidLoad()
var doubleObject = 1.1
print("doubleObject原来的值:\(doubleObject)")
print("doubleObject调用属性拓展的值:\(doubleObject.pingfang2)")
doubleObject.lifang3()
print("doubleObject调用自赋值方法拓展的值:\(doubleObject)")
print("doubleObject调用自赋值方法拓展带返回的值:\(doubleObject.lifang3return())")
print("doubleObject和原来的值已经不同了:\(doubleObject)")
}
运行结果:
doubleObject原来的值:1.1
doubleObject调用属性拓展的值:1.2100000000000002
doubleObject调用自赋值方法拓展的值:1.3310000000000004
doubleObject调用自赋值方法拓展带返回的值:2.357947691000002
doubleObject和原来的值已经不同了:1.3310000000000004