欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

swift中Extension的简单理解

程序员文章站 2024-03-17 21:56:22
...

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,

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