《swift2.0 官方教程中文版》 第2章-21扩展
import Foundation
//Swift 中的扩展可以: //? 添加计算型属性和计算型静态属性 //? 定义实例方法和类型方法 //? 提供新的构造器 //? 定义下标 //? 定义和使用新的嵌套类型 //? 使一个已有类型符合某个协议
/*扩展语法**************************************************************/
//声明一个扩展使用关键字 extension : //extension SomeType { // // 加到SomeType的新功能写到这里 //}
//一个扩展可以扩展一个已有类型,使其能够适配一个或多个协议(protocol)。当这种情况发生时,协议的名字 应该完全按照类或结构体的名字的方式进行书写: //extension SomeType: SomeProtocol,AnotherProctocol { // // 协议实现写到这里 //}
/*计算型属性**************************************************************/ 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"
//这些计算属性表达的含义是把一个 Double 型的值看作是某单位下的长度值。即使它们被实现为计算型属性,但 这些属性仍可以接一个带有dot语法的浮点型字面值,而这恰恰是使用这些浮点型字面量实现距离转换的方式。
let aMarathon = 42.km + 195.m print("A marathon is (aMarathon) meters long") // 打印输出:"A marathon is 42195.0 meters long" //扩展可以添加新的计算属性,但是不可以添加存储属性,也不可以向已有属性添加属性观测器(property obser vers)。
/*构造器**************************************************************/ //扩展可以向已有类型添加新的构造器。这可以让你扩展其它类型,将你自己的定制类型作为构造器参数,或者提供该类型的原始实现中没有包含的额外初始化选项。 //如果你使用扩展向一个值类型添加一个构造器,在该值类型已经向所有的存储属性提供默认值,而且没有定义任 何定制构造器(custom initializers)时,你可以在值类型的扩展构造器中调用默认构造器(default initializer s)和逐一成员构造器(memberwise 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(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: ()->()) { for i in 0..<self { task() } } } //这个 repetitions 方法使用了一个 () -> () 类型的单参数(single argument),表明函数没有参数而且没有返回 值
3.repetitions({ print("Hello!") })
//可以使用 trailing 闭包使调用更加简洁:
3.repetitions{ print("Goodbye!") }
extension Int { mutating func square() { self = self * self } } var someInt = 3 someInt.square() print("someInt现在值是(someInt)") // someInt 现在值是 9
/*下标**************************************************************/ //扩展可以向一个已有类型添加新下标。这个例子向Swift内建类型 Int 添加了一个整型下标。该下标 [n] 返回十进 制数字从右向左数的第n个数字 extension Int { subscript(var digitIndex: Int) -> Int { var decimalBase = 1 while digitIndex > 0 { decimalBase *= 10 --digitIndex } return (self/decimalBase) % 10 } } print("(746381295[0])") print("(746381295[1])") print("(746381295[5])") print("(746381295[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 } } } //该例子向 Int 添加了新的嵌套枚举。这个名为 Kind 的枚举表示特定整数的类型。具体来说,就是表示整数是正数,零或者负数。 //现在,这个嵌套枚举可以和一个 Int 值联合使用了: func printIntegerKinds(numbers:[Int]) { for number in numbers { switch number.kind{ case .Negative: print("-") case .Zero: print("0") default: print("+") } } print(" ") } printIntegerKinds([3,19,-27,0,-6,7]) // prints "+ + - 0 - 0 +"
//函数 printIntegerKinds 的输入是一个 Int 数组值并对其字符进行迭代。在每次迭代过程中,考虑当前字符的 kind 计算属性,并打印出合适的类别描述。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |