寒城攻略:Listo 教你 25 天学会 Swift 语言 - 22 Extensions
//*********************************************************************************************** //1.Extensions(扩展) //_______________________________________________________________________________________________ //介绍 //扩展就是向一个已有的类,结构体或者枚举类型添加新功能。在 Swift 中,扩展可以添加计算型属性和计算静态属性,定义实例方法和类型方法,提供新的构造器,定义下标,定义和使用新的嵌套类型,使一个已有类型符合某个接口
//*********************************************************************************************** //2.Extension Syntax(扩展语法) //实例代码演示使用 extension 声明一个扩展 /* extension someType{ //加到SomeType的新功能写到这里 } */
//_______________________________________________________________________________________________ //一个扩展可以扩展一个已有的类型,使其能够适配一个或者多个协议 /* extension SomeType: SomeProtocol,AnotherProtocol{ //协议实现写在这里 //3.Computed Properties(计算型属性) //实例代码演示扩展向已有类型添加计算型属性和计算型类型属性 extension Double{ var km: Double{ //给 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 //调用扩展中的计算型实例属性 println("one inch is (oneInch) meters")
let threeFeet = 3.ft println("Three feet is (threeFeet) meters")
//4.Initializers(构造器) //实例代码演示扩展向已有类型添加新的构造器 struct Size { var width = 0.0,height = 0.0 } struct Point{ var x = 0.0,y = 0.0 } struct Rect{ //因为结构体 Rect 提供了所有属性的默认值,所以它会自动的接受一个默认构造器和一个成员级构造器 var origin = Point() var size = Size() }
let defaultRect = Rect() //创建 Rect 实例的默认方法 let memberwiseRect = Rect(origin: Point(x: 2.0,y: 2.0),size: Size(width: 5.0,height: 5.0)) //实例的完整参数方法 println(memberwiseRect.origin.x,memberwiseRect.origin.y)
extension Rect{ //使用扩展向 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)) println(centerRect.origin.x,centerRect.origin.y)
//5.Methods(方法) //实例代码演示扩展向已有类型添加新的实例方法和类型方法 extension Int{ //给 Int 类型扩展添加方法 func repetitions(task: () -> ()){ //这个 repetitions 方法使用了一个 () -> () 类型的参数,表明函数没有参数,没有返回值 for i in 0...self{ //设置 for in 重复输出参数 task() } } }
3.repetitions({ println("Hello") })
//通过扩展添加修改实例的方法 extension Int{ mutating func square(){ //通过扩展添加的实例方法也可以修改该实例本身。结构体和枚举类型中修改 self 或其属性的方法必须将该实例方法标注为 mutating,正如来自原始实现的修改方法一样 self = self * self } } var someInt = 3 someInt.square() println(someInt)
//6.Subscripts(下标) //实例代码演示扩展向一个已有类型添加新下标 extension Int{ subscript(digitIndex: Int) -> Int{ var decimalBase = 1 for _ in 1...digitIndex{ decimalBase *= 10 } return (self / decimalBase) % 10 } } println(746381295[8])
//7.Nested Types(嵌套类型) //扩展向已有的类,结构体,枚举添加新的嵌套类型 extension Character{ //向 Character 添加了新的嵌套枚举 enum Kind{ case Vowel,Consonant,Other //名为 Kind 的枚举表示特定字符的类型 } 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 } } } func printLetterKinds(word: String){ //写一个方法来判断参数的字母类型 println("'(word' is made up of the following kinds of letters:")
for character in word { //迭代参数的字母 switch character.kind { case .Vowel: println("vowel ") case .Consonant: println("consonant ") case .Other: println("other ") } } print("n") } printLetterKinds("Hello")
转载:http://blog.csdn.net/u013096857/article/details/37872239
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |