在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
//扩展(Extensions)
import UIKit
/*扩展(Extensions):扩展 就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即 逆向建模 )
Swift 中的扩展可以:扩展可以为一个类型添加新的功能,但是不能重写已有的功能 1.添加计算型属性和计算型类型属性,扩展可以添加新的计算型属性,但是不可以添加存储型属性,也不可以为已有属性添加属性观察器 2.定义实例方法和类型方法 3.提供新的构造器: 1.扩展能为类添加新的便利构造器,但是它们不能为类添加新的指定构造器或析构器。指定构造器和析构器必须总是由原始的类实现来提供。 2.如果你使用扩展为一个值类型添加构造器,且该值类型的原始实现中未定义任何定制的构造器时,你可以在扩展中的构造器里调用逐一成员构造器。如果该值类型为所有存储型属性提供了默认值,你还可以在扩展中的构造器里调用默认构造器。 4.扩展可以为已有类型添加新下标 5.定义和使用新的嵌套类型 6.使一个已有类型符合某个协议 在 Swift 中,你甚至可以对协议进行扩展,提供协议要求的实现,或者添加额外的功能,从而可以让符合协议的类型拥有这些功能
扩展语法(Extension Syntax):可以通过扩展来扩展一个已有类型,使其采纳一个或多个协议 extension SomeType: SomeProtocol, AnotherProctocol { // 为 SomeType 添加的新功能写到这里 }
如果你通过扩展为一个已有类型添加新功能,那么新功能对该类型的所有已有实例都是可用的,即使它们是在这个扩展定义之前创建的
*/ 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 } } let oneInch = 25.4.mm print("One inch is \(oneInch) meters") // 打印 “One inch is 0.0254 meters” let threeFeet = 3.ft print("Three feet is \(threeFeet) meters") // 打印 “Three feet is 0.914399970739201 meters” let aMarathon = 42.km + 195.m print("A marathon is \(aMarathon) meters long") // 打印 “A marathon is 42195.0 meters long” //============================== 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 未提供定制的构造器,因此它会获得一个逐一成员构造器。又因为它为所有存储型属性提供了默认值,它又会获得一个默认构造器 let defaultRect = Rect() let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0)) 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) } } 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) //================================ extension Int { func repetitions(task: () -> Void) { for _ in 0..<self { task() } } } 3.repetitions({ print("Hello!") }) // Hello! // Hello! // Hello! //通过扩展添加的实例方法也可以修改该实例本身。结构体和枚举类型中修改 self 或其属性的方法必须将该实例方法标注为 mutating,正如来自原始实现的可变方法一样 extension Int { mutating func square() { self = self * self } } var someInt = 3 someInt.square() print(someInt) // someInt 的值现在是 9 //=================================== extension Int { subscript(var digitIndex: Int) -> Int { var decimalBase = 1 while digitIndex > 0 { decimalBase *= 10 --digitIndex } return (self / decimalBase) % 10 } } 746381295[0] // 返回 5 746381295[1] // 返回 9 746381295[2] // 返回 2 746381295[8] // 返回 7 746381295[9] // 返回 0,即等同于: 0746381295[9] //=============================== 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 +” |
请发表评论