
一、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变量。而在类中,不需要;因为类中的方法本来就可以修改变量
@H_403_138@ 举个例子: @H_403_138@
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. @H_403_138@
@H_403_138@ 四、 一个类如果实现了两个 protocol ,并且这两个 protocol 定义的方法有可能有重名的解决办法 @H_403_138@ 举个例子: @H_403_138@
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方法,所以要经过类型转化。 @H_403_138@ 总结 以上是内存溢出为你收集整理的Swift:Extension和Protocol全部内容,希望文章能够帮你解决Swift:Extension和Protocol所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)