扩展就是向一个已有的类、结构体或枚举类型添加新功能,这包括在没有权限获取原始源代码的状况下扩展类型的能力。
扩展和 Objective-C
中的分类(category
)相似,可是它要比分类强大的多,它不只能够扩展类,还能够扩展协议、枚举、结构体,另外扩展也不局限于扩展方法,还能够扩展便利构造方法、计算属性、下标脚本等php
//使用扩展须要使用到extension关键字,这里的SomeType能够是类、结构体、枚举、协议等类型 extension SomeType{ //添加到SomeType的新功能写在这里 } //一个扩展能够扩展一个已有类型,使其可以适配一个或多个协议 extension SomeType: SomeProtocol, AnotherProctocol { // 协议实现写到这里 }
//扩展系统结构体Double,添加计算属性 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 } } var inch:Double = 25.4 let oneInch = inch.mm print("One inch is \(oneInch) meters") // 打印输出:One inch is 0.0254 meters var feet:Double = 3.0 let threeFeet = feet.ft print("Three feet is \(threeFeet) meters") // 打印输出:Three feet is 0.914399970739201 meters
注意:
扩展能够添加新的计算属性,可是不能够添加存储属性,也不能够向已有属性添加属性观测器。git
//向Int类型添加一个名为repetitions的新实例方法,接受一个空参数无返回值的函数类型参数 extension Int { func repetitions(task: () -> ()) { //重复执行自己值次数的函数 for _ in 0..<self { task() } } //扩展类型方法 static func number()->[Int]{ return [1, 2, 3] } } var value:Int = 3 value.repetitions({ print("Hello World") }) /* 打印: Hello World Hello World Hello World */ value.repetitions{//尾闭包简化 print("extension") } /* 打印: extension extension extension */ print(Int.number())//打印:[1, 2, 3]
//定义一个类 class Person { var firstName:String var lastName:String var age:Int = 0 var fullName:String{ get{ return firstName + " " + lastName } } init(firstName:String, lastName:String){ self.firstName = firstName self.lastName = lastName } } //扩展该类,扩展便利构造器方法 extension Person{ //类类型只能扩展便利构造方法,不能扩展指定构造方法 convenience init(){ self.init(firstName:"", lastName:"") } } var p = Person() p.firstName = "Liu" p.lastName = "Ting" p.age = 22 print(p.fullName) //打印:Liu Ting /* 扩展结构体 */ 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() } //默认构造器方法 let defaultRect = Rect() //成员逐一构造器方法 let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0)) //扩展结构体 extension Rect { //这个新的构造器会根据提供的center和size值计算一个合适的原点。 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的原点是 (2.5, 2.5),大小是 (3.0, 3.0)
//为系统类型Int添加扩展 extension Int { //扩展下标脚本,获取对应下标位数的数字 subscript(digitIndex: Int) -> Int { var decimalBase = 1 for _ in 0..<digitIndex { decimalBase *= 10 } return (self / decimalBase) % 10 } } var value:Int = 1234567 print(value[0]) //结果:7 print(value[1]) //结果:6 print(value[2]) //结果:5 print(value[3]) //结果:4
//为系统类型Character添加扩展 extension Character { //扩展嵌套类型,表示元音、辅音、其余 enum Kind { case Vowel, Consonant, Other } //扩展计算属性 var kind: Kind { //转为小写后进行元辅音匹配 switch String(self).lowercaseString { case "a", "e", "i", "o", "u": return .Vowel case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z": return .Consonant default: return .Other } } } var word = "Hello" //遍历字符串的全部字符 for character in word.characters { switch character.kind { case .Vowel: //由于kind属性指定了类型,是Character.Kind.Vowel的简化 print("\(character)是元音") case .Consonant: print("\(character)是辅音") case .Other: print("\(character)是其余") } } /* 打印: H是辅音 e是元音 l是辅音 l是辅音 o是元音 */
灵活使用Swift的扩展,能够提升咱们的编码效率,就像咱们在OC中积累项目经验,有一些东西会已分类的形式进行积累,能够方便咱们移植到其余项目中,提升咱们的效率,Swift扩展就是比这个更增强大的存在,没理由不用编程
提供一个好用的在线Swift编译网站:Swift在线编程swift