寒城攻略: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

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...