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,

今天就到这吧,准备洗脸上班了。。。

上一篇下一篇

猜你喜欢

热点阅读