博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift 扩展(Extension)总结
阅读量:5789 次
发布时间:2019-06-18

本文共 2592 字,大约阅读时间需要 8 分钟。

概要

扩展是给已经存在的类(class),结构体(structure),枚举类型(enumeration)和协议(protocol)增加新的功能。类似Objective-C中的Category,不同的是,Extension没有名字。扩展可以做以下事情:

  • 增加计算实例属性和计算类型属性
  • 定义实例方法和类型方法
  • 提供新的初始化器
  • 定义下标
  • 定义和使用新的内置类型
  • 让一个存在的类型服从一个协议

注:扩展可以增加新的功能,但是不能覆盖已有的功能

扩展的语法

使用extension关键字,如下所示。

extension SomeType{   //new functionality to add to SomeType goes here}extension SomeType: SomeProtocol, AnotherProtocol{   //implementation of protocol requirements goes here}

注意:如果你给已经存在的类型扩展了新的功能,不管你在什么时候扩展,尽管你是在实例定义之后再扩展的,那么这个类型所有的实例都可以使用这个新功能,

计算属性

扩展可以给已经存在的类型增加计算实例属性和计算类型属性,如以下扩展了Double类型:

extension Double{   var km : Double { return self * 1000.0 }   var m: Double { return self }   var cm: Double { return self / 100.0 }   var mm: Double { return self / 1000.0 }   var ft: Double { return self / 3.28084 }}let oneInch = 25.4.mm;print("One inch is \(oneInch)meters")

构造方法(Initializers)

可以扩展一个类型实现自定义构造方法,但是只能增加便利构造方法(Convenience Initializers),不能增加指定构造方法(Designated Initializers)。

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结构体没有自定义的构造方法,因为其属性都有初始值,所以系统提供了一个默认构造方法和逐一成员构造方法,在增加构造方法时,可以调用逐一成员构造方法。要确保类型中所有的存储属性都有初始值。

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{   funcrepetitions(task: () -> Void) {     for _ in 0..

可变实例方法(Mutating Instance Methods)

扩展增加的实例方法可以修改实例本身。结构体和枚举类型中的方法如果想要修改实例本身或者属性的话需要用mutating来修饰方法,所以扩展这样的方法也需要加mutating

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

下标

扩展可以给存在的类型增加新的下标,如下的例子:

extension Int{   subscript(digitIndex: Int) -> Int {     var decimalBase = 1     for _ in 0..

内置类型

扩展可以给存在的类、结构体和枚举类型增加新的内置类型。

extension Int{   enumKind {     casenegative, 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])// Prints "+ + - 0 - 0 +

作者:泗哥
链接:https://www.jianshu.com/p/edf4cad8dfd5
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转载于:https://www.cnblogs.com/xujinzhong/p/8615406.html

你可能感兴趣的文章
数据结构之链表与哈希表
查看>>
IIS7/8下提示 HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求...
查看>>
http返回状态码含义
查看>>
响应式网站对百度友好关键
查看>>
洛谷P2179 骑行川藏
查看>>
(十八)js控制台方法
查看>>
VB关键字总结
查看>>
android代码生成jar包并混淆
查看>>
一个不错的vue项目
查看>>
屏蔽指定IP访问网站
查看>>
python学习 第一天
查看>>
根据毫秒数计算出当前的“年/月/日/时/分/秒/星期”并不是件容易的事
查看>>
python的图形模块PIL小记
查看>>
shell变量子串
查看>>
iOS的主要框架介绍 (转载)
查看>>
react报错this.setState is not a function
查看>>
poj 1183
查看>>
从根本解决跨域(nginx部署解决方案)
查看>>
javascript实现的一个信息提示的小功能/
查看>>
Centos7.x:开机启动服务的配置和管理
查看>>