- swift中扩展适用于类、结构体、枚举和协议
- swift中的extension类似于Oc中的categories,不同之处在于extension没有名字
- swift中的extension可以
1.增加计算实例属性和计算类型属性
2.定义实例方法和类型方法
3.提供新的构造器
4.定义附属脚本语句
5.定义和使用新的内嵌类型
6.使现有的类型遵循协议 - extension可以实现和拓展协议,使遵循该协议的类实现更多功能
- extension可以使一个类型新增功能,但是不能使其重载现有的
- 使用extension关键字定义扩展
extension SomeType { //new functionality to add to Sometype goes here }
- 使用extension关键字加协议名实现协议扩展和实现
extension SomeType: SomeProtocol, AnotherProtocol { //inplementation of protocol requirement goes here }
- 在原类基础上扩展的新方法,可以应用于所有的原类实例中,即使实例创建于扩展声明前
- extension扩展计算属性
//Computed Properties extension Double { var Km: Double { return self * 1_000 } 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") let threeFeet = 3.ft print("Three feet is \(threeFeet) meters")
- extension可以添加计算属性,但是不能添加存储属性或给现有的属性添加观察者
- extension可以添加便利构造器(不用convenience关键字),但是不能添加指定构造器和析构器
//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() } let defaultRect = Rect() let memberwiseRect = Rect.init(origin: Point.init(x: 2.0, y: 2.0), size: Size.init(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.init(x: originX, y: originY), size: size) } } let centerRect = Rect.init(center: Point.init(x: 4.0, y: 4.0), size: Size.init(width: 3.0, height: 3.0))
- extention添加方法
无参数无返回值的闭包作为方法参数,直接在方法大括号内加入实现//Methods extension Int { func repetitions(task: () -> Void) { for _ in 0..<self { task() } } } 3.repetitions { print("Hello") }
- extension中使用mutating关键字来改变自身
//Mutating Instance Methods extension Int { mutating func square { self = self * self } } var someInt = 3 someInt.square()
- extension附属脚本
extension Int { subscript(digitIndex: Int) -> Int { var decimalBase = 1 for _ in 0..<digitIndex{ decimalBase *= 10 } return (self / decimalBase) % 10 } } print("\(12345678[0])") print("\(12345678[3])")
- extension内嵌类型
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])
网友评论