标签: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())如,例子中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()
}
}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()版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:switch 扩展和协议 extension和protocol
原文地址:http://blog.csdn.net/sinat_27706697/article/details/47064997