美文网首页
swift中Extension的简单理解

swift中Extension的简单理解

作者: 改变自己_now | 来源:发表于2016-01-27 07:22 被阅读2035次

    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,
    

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

    相关文章

      网友评论

          本文标题:swift中Extension的简单理解

          本文链接:https://www.haomeiwen.com/subject/xaudkttx.html