美文网首页
Swift扩展

Swift扩展

作者: 奔跑的鸿 | 来源:发表于2020-07-28 23:25 被阅读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)

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

扩展构造器

  • 扩展可以向类添加新的便利构造器,但是它们不能向类添加新的指定构造器或析构器。指定构造器或析构器必须始终由原始类实现提供。
  • 如果使用扩展将构造器添加到值类型中,该值类型为其所有存储属性提供默认值,并且没有任何自定义构造器,则可以在扩展的构造器中调用该值类型的默认构造器和全能构造器。
  • 如果使用扩展将构造器添加到声明在另一个模块中的结构体中,则新的构造器只有从定义的模块中调用了构造器才能访问self
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)

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

扩展方法

  • 通过扩展增加的实例方法可以修改实例本身
    如果结构体和枚举的方法要修改self或其属性,则需要使用mutating关键字标明
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

相关文章

网友评论

      本文标题:Swift扩展

      本文链接:https://www.haomeiwen.com/subject/hnkcrktx.html