码迷,mamicode.com
首页 > 编程语言 > 详细

Swift:Extension和Protocol

时间:2015-07-26 09:51:27      阅读:415      评论:0      收藏:0      [点我收藏+]

标签:switch   扩展和协议   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方法,所以要经过类型转化。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Swift:Extension和Protocol

标签:switch   扩展和协议   extension和protocol   

原文地址:http://blog.csdn.net/sinat_27706697/article/details/47064997

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!