swift中Extension的简单理解
2016-01-27 本文已影响2035人
改变自己_now
swift中的extension和OC中的Category有点类似,同时也比category的功能更加的强大,想enum、struct等都可以用extension来扩展,下面是extension能够办到的:
1.添加计算实例属性(computed property)和计算类属性
2.定义实例方法和类方法
3.提供新的构造器
4.定义和使用新的嵌套类型
5.定义下标(subscipt)
6.使其遵守某个接口协议
接下来我们通过一个个例子来看看如何使用extension,其实很语法格式如下:
extension NSDate {
// 1.添加计算属性或者方法
}
extension NSDate:UITableViewDelegate {
//2可以扩展类型时,让类型遵守协议
}
注意:NSDate只是一个例子而已
例子1:为Double添加一些计算属性
extension Double {
var km:Double {
return self*1000.0
}
var m:Double {
return self;
}
var cm:Double {
return self/100.0;
}
var mm:Double {
return self/1000.0
}
var ft:Double {
return self/3.28084
}
}
特别提醒:扩展只能添加些的计算属性,但不能添加存储属性,也不能像已有属性添加属性观察。
对double扩展后我们就可以使用了,使用如下:
let distance = 22.5.km
let cm = 12.0.cm
print("这就是距离\(distance)米")
// 打印结果 这就是距离22500.0米 这样的扩展是不是用起来很方便,
不得不佩服swift的强大!!
例2:定义一个Test_rect为其添加初始化方法
struct Size {
var width = 0.0
var height = 0.0
}
struct Point {
var x = 0.0
var y = 0.0
}
struct Test_Rect {
var origin = Point()
var size = Size()
}
//4.添加初始化方法
extension Test_Rect {
init(center: Point, size: Size){
let originX = center.x - size.width/2.0
let originx = center.y - size.height/2.0
//调用本类的自动得到的成员构造器
self.init(origin:Point(x: originX, y: originx), size:Size(width: size.width, height: size.height))
}
}
使用:
//使用系统自带的初始化方法
let initRect = Test_Rect(origin: Point(x: 2, y: 3), size: Size(width: 2, height: 3) )
// 使用extension的初始化方法
let test_rect = Test_Rect(center: Point(x: 2, y: 3), size: Size(width: 2, height: 3))
说明:这里因为Rect结构体都提供了属性的默认值,它可以自动会有一个默认的构造器和一个成员逐一的构造器 即:init()方法和init(origin:Point, size: 那么我们可以直接使用。
例3:为Int扩展一些方法
extension Int {
// / 参数是一个单类型的闭包,没有参数,没有返回值的闭包
该方法有点类似OC中的对象方法
func repeates(task: () -> ()){
for i in 1...self {
task()
}
}
// 静态方法(有点类似于)
static func multiply(num1: Int, num2: Int) -> Int {
return num1*num2
}
//要修改Self,就需要是可改类型方法,需要加上关键字mutating
(不过好像我在工程中不能调用,我也不理解,求大神指点)
mutating func square() {
self = self*self
}
}
使用:
4.repeates {
print("给我打印一下")
}
// 打印了四次,因为是从1开始的哦
print(Int.multiply(2, num2: 3)) // 这个方法为类方法 打印为6
第三个扩展方法不能调用编译器报错,我不是很理解,求大神指点!!
例4:为已有类型(值类型定义添加新下标)
extension Int {
// 自定义的下标方法
subscript(index: Int) ->Int {
var decimalBase = 1
for _ in 1...index {
decimalBase *= 10
}
return (self / decimalBase)%10
}
}
使用:
print(123456[4])
// 打印结果为2,