Swift:Extension和Protocol
一、Swift中的扩展功能(Extension)可以动态给类增加功能,类似于Javascript中的prototype; 而在objective-c中,是通过runtime来实现动态调用或者添加功能的。 定义方式如下: extension SomeType { } 1. 单位转换 extension Double { var km: Double {return self * 1000.0} } 调用的代码如下: let walk: Double = 25.4; print("25.4千米 = (walk.km)米")最终输出结果为:"25.4千米 = 25400.0米" 从上面的定义可以看出:我们为类型Double扩展了一个只读属性km,所以每次调用的时候,都会将结果乘以1000.0
2. 数字转中文 func getChineseNumber(number: Int) -> String { let chineseList = "零一二三四五六七八九" let index = advance(chineseList.startIndex,number) return String(chineseList[index]) } extension Int { func toChieseNumber() -> String { var result: String = "" var num = self; while (num > 0) { result = getChineseNumber(num % 10) + result; num = num / 10 } return result; } } 调用的代码如下:
212332423.toChieseNumber()最终输出结果为:"二一二三三二四二三" 从上面的定义可以看出:我们为类型Int扩展了一个方法,这个方法的作用就是将输入的数字转化为中文字符串。
二、Swift中的协议类似于C#中的接口(Interface),但Swift中的协议更强大,协议中不仅可以定义方法, 也可以定义属性;协议不仅可以作用于类,还可以在结构体和枚举中使用。 定义方式如下: protocol SomeProtocol { // 协议内容 } class SomeClass: SomeSuperClass,SomeProtocol { // 类的内容 } 举个例子: protocol FullNamed { var fullName: String {get} func greeting() -> String } class Person: FullNamed { var fullName: String = "" init(fullName: String) { self.fullName = fullName } func greeting() -> String { return "hello " + self.fullName } } let zhansan = Person(fullName: "张三") println(zhansan.greeting()) 注意:协议protocol中定义的相关属性或者方法,实现它的类中,必须实现这些属性和方法。 如,例子中FullNamed协议,定义了fullName属性和greeting方法。在其实现的类Person中都有实现。 var fullName: String = "" 就是实现了协议FullNamed中的fullName属性。 init初始化方法进一步对属性fullName赋值。
协议的好处:就是协议中只定义属性或者方法而没有具体的实现,这些实现工作就交给了实现这个协议的类或者结构,枚举等去完成。这样,更有利于代码的抽取及封装。并且通过协议可以实现多态的效果及工厂功能等。
三、Swift 的mutating关键字修饰方法是为了能在该方法中修改struct或者enum变量。而在类中,不需要;因为类中的方法本来就可以修改变量
举个例子:
protocol Vehicle { var numberOfWheels: Int {get} var color: UIColor {get set} mutating func changeColor() } struct MyCar: Vehicle { let numberOfWheels = 4 var color = UIColor.redColor() mutating func changeColor() { self.color = UIColor.grayColor() } } 协议Vehicle中定义了一个方法changeColor,并且它是用mutating来修饰的。这样的好处就是在实现协议的结构MyCar中的changeColor方法可以直接修改自己成员变量的值了,比如将color成员变量的值初始化为grayColor.
四、
一个类如果实现了两个
protocol
,并且这两个
protocol
定义的方法有可能有重名的解决办法
举个例子:
protocol A { func bar() -> Int } protocol B { func bar() -> String } class Dog: A,B { func bar() -> Int { return 1 } func bar() -> String { return "Hello" } } let instance = Dog() let num = (instance as A).bar() let str = (instance as B).bar()注意,在调用bar方法的时候,必须指定是那个协议的bar方法,所以要经过类型转化。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |