Swift扩展

2020-07-28  本文已影响0人  奔跑的鸿

扩展: 就是给一个现存类, 结构体, 枚举或者协议添加新的属性和方法的语法, 无需目标源码, 就可以把想要的代码加到目标上面。
但有一些限制条件需要说明:
1.不能添加一个已经存在的方法或者属性;
2.添加的属性不能是存储属性, 只能是计算属性;

格式:
 extension 某个先有类型{
    //增加新的功能
 }

扩展计算属性

class Transport {
    var scope:String
    init(scope:String) {
        self.scope = scope
    }
}
extension Transport {
    var extProperty:String{
        get{
            return scope
        }
    }
}
var myTrans = Transport(scope: "飞机")
print(myTrans.extProperty)

注意: 扩展可以添加新的计算属性,但它们不能添加存储属性,或向现有属性添加属性观察者。

扩展构造器

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()
}

Rect结构为其所有属性提供默认值,所以它会自动接收默认构造器和全能构造器。这些构造器可用于创建新的Rect实例:

let defaultRect = Rect()
let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0))

可以扩展Rect结构体以提供额外的构造器,该构造器具有特定的中心点和大小:

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))
// centerRect's origin is (2.5, 2.5) and its size is (3.0, 3.0)

注意:如果使用扩展来提供一个新初始化器,要确保构造器完成之后,每个实例都被完全初始化。

扩展方法

extension Int {
    mutating func square() {
        self = self * self
    }
}
var someInt = 3
someInt.square()

扩展下标

extension Int {
    subscript(digitIndex: Int) -> Int {
        var decimalBase = 1
        for _ in 0..<digitIndex {
            decimalBase *= 10
        }
        return (self / decimalBase) % 10
    }
}
746381295[0]
// returns 5
746381295[1]
// returns 9
746381295[2]
// returns 2
746381295[8]
// returns 7
上一篇下一篇

猜你喜欢

热点阅读