Swift - extension
一.概述 - extension
在swift中,swift可以为特定的class, strut, enum或者protocol添加新的特性。当你没有权限对源代码进行改造的时候,此时可以通过extension来对类型进行扩展。extension有点类似于OC的类别 – category,但稍微不同的是category有名字,而extension没有名字。
swift的extension可以做如下几件事,
添加计算属性 - computed properties
添加方法 - methods
添加初始化方法 - initializers
添加附属脚本 - subscripts
添加并使用嵌套类型 - nested types
遵循并实现某一协议 - conform protocol
在swift中,你甚至可以对一个协议protocol进行扩展,实现其协议方法或添加额外的功能,以便于实现该协议的类型可以使用,在swift中,这叫做协议扩展 - protocol extension,后面的内容会举例说明。
二.语法 - extension
定义extension的语法非常简单,只需要使用extension关键字,如下代码
下面展示一些 内联代码片
。
extension SomeType {
// new functionality to add to SomeType goes here
}
extension可以让一个特定的类型实现一个或多个协议,也就是说无论对于class, structure或enum等类型而言,都可以实现一个或多个协议,如下代码所示
extension SomeType: SomeProtocol, AnotherProtocol {
// implementation of protocol requirements goes here
}
三. 添加多种特性
3.1 添加计算属性 - computed properties
extension可以为已经存在的类型添加计算属性(computed properties),下面的demo为swift内置的Double类型添加了5个计算属性,分别是km, m, cm, mm, ft,用来提供基础的计算距离的功能,如下代码所示。
extension Double {
var km: Double {
return self * 1_000.0 }
var m: Double {
return self }
var cm: Double {
return self / 100.0 }
var mm: Double {
return self / 1_000.0 }
var ft: Double {
return self / 3.28084 }
}
// usage of Double extension
let oneInch = 25.4.mm
print("One inch is \(oneInch) meters")
// Prints "One inch is 0.0254 meters"
let threeFeet = 3.ft
print("Three feet is \(threeFeet) meters")
// Prints "Three feet is 0.914399970739201 meters"
什么是计算属性呢?这大概算是swift语言的特性吧,在swift中属性有两种类型,一种是存储属性,另一种是计算属性。存储属性就是存储在特定的class, struct中的一个常量或变量,可以在定义存储属性的时候指定默认值,也可以在构造过程中设置或修改存储属性的值,需要注意的是enum中并不能定义存储属性;而计算属性不直接存储值,而是提供一个getter, setter来间接获取和设置其他属性和变量的值。
归纳一下,swift中存储属性和计算属性的区别如下表,