美文网首页Swift之家
Swift 扩展(Extension)

Swift 扩展(Extension)

作者: 小小土豆dev | 来源:发表于2017-07-09 16:53 被阅读37次

    扩展(Extension)

    扩展:就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即 逆向建模)。扩展和 Objective-C 中的分类类似(与 Objective-C 不同的是,Swift 的扩展没有名字)

    扩展作用

    1、可以添加计算型属性和计算型类型属性

    2、可以定义实例方法和类型方法

    3、可以提供新的构造器

    4、可以定义下标

    5、可以定义和使用新的嵌套类型

    6、可以使一个已有类型符合某个协议

    扩展语法:

    使用关键字 extension 来声明扩展

    extension SomeType {

        // 为 SomeType 添加的新功能写到这里

    }

    可以通过扩展来扩展一个已有类型,使其采纳一个或多个协议。在这种情况下,无论是类还是结构体,协议名字的书写方式完全一样

    extension SomeType: SomeProtocol, AnotherProctocol {

        // 协议实现写到这里

    }

    如果你通过扩展为一个已有类型添加新功能,那么新功能对该类型的所有已有实例都是可用的,即使它们是在这个扩展定义之前创建的。

    计算型属性扩展

    扩展可以为已有类型添加计算型实例属性和计算型类型属性。但是不可以添加存储型属性,也不可以为已有属性添加属性观察器。

    extension Double {

        var cm: Double {

            return self / 100.0

        }

    }

    方法扩展

    扩展可以为已有类型添加新的实例方法和类型方法。

    extension Int {

    func sum(_ num: Int) -> Int {

    return self + num

    }

    }

    构造器扩展:

    扩展可以为已有类型添加新的构造器。这可以让你扩展其它类型,将你自己的定制类型作为其构造器参数,或者提供该类型的原始实现中未提供的额外初始化选项。

    扩展能为类添加新的便利构造器,但是它们不能为类添加新的指定构造器或析构器。指定构造器和析构器必须总是由原始的类实现来提供。

    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)

    }

    }

    下标扩展

    扩展可以为已有类型添加新下标

    extension Int {

         subscript(digitIndex: Int) -> Int {

              var decimalBase = 1

              for _ in 0..<digitIndex 

                   decimalBase *=10

              }

              return (self / decimalBase) % 10

         }

    }

    746381295[0] // 返回 5

    746381295[1] // 返回 9

    746381295[2] // 返回 2

    746381295[8] // 返回 7

    嵌套类型扩展

    扩展可以为已有的类、结构体和枚举添加新的嵌套类型

    extension Int {

      enum Kind {

      case Negative, Zero, Positive

      }

      var kind: Kind {

        switch self {

        case 0:

        return .Zero

        case let x where x > 0:

        return .Positive

        default:

        return .Negative

        }}

    }

    func printIntegerKinds(_ numbers: [Int]) {

        for number in numbers {

            switch number.kind {

            case .Negative:

            print("- ", terminator: "")

            case .Zero:

            print("0 ", terminator: "")

            case .Positive:

            print("+ ", terminator: "")

            }

        }

        print("")

    }

    printIntegerKinds([3, 19, -27, 0, -6, 0, 7]) // 打印 + + - 0 - 0 +

    相关文章

      网友评论

        本文标题:Swift 扩展(Extension)

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