Swift 扩展(Extension)

扩展(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 +

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • (转载自http://letsswift.com/2014/06/extensions/) 扩展就是向一个已有的类...
    StrongX阅读 1,626评论 0 11
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,948评论 1 10
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 3,871评论 0 6
  • 132.转换错误成可选值 通过转换错误成一个可选值,你可以使用 try? 来处理错误。当执行try?表达式时,如果...
    无沣阅读 1,330评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,200评论 19 139