zoukankan      html  css  js  c++  java
  • Swift-----扩展extension

    1. 类、结构体、枚举都是可以扩展的。

      (1)可以在扩展中添加方法;

      (2)可以在扩展中添加属性----这个属性只能是计算型属性,不可以是存储型属性;

      (3)可以在扩展中添加构造函数----这个构造函数只能是便利构造函数,不可以是指定构造函数。

      以上可以看到,代码的基石还是在原来的类(结构体、枚举)中的,扩展只能起到辅助的作用。

    struct Point {
        
        var x: Double = 0.0
        var y: Double = 0.0
    }
    
    struct Size {
        
        var  Double = 0.0
        var height: Double = 0.0
    }
    
    class Rectangle {
    
        var origin = Point()
        var size = Size()
        
        init(origin: Point, size: Size) {
            
            self.origin = origin
            self.size = size
        }
    }
    extension Rectangle {
    
        // 扩展方法
        func translate(x: Double, y: Double) {
            
            self.origin.x += x
            self.origin.y += y
        }
        
        // 扩展属性---只能扩展计算型属性,不能扩展存储型属性
        var center: Point {
            
            get {
                let centerX = origin.x + size.width/2
                let centerY = origin.y + size.height/2
                return Point(x: centerX, y: centerY)
            }
            set {
                origin.x = newValue.x - size.width/2
                origin.y = newValue.y - size.height/2
            }
        }
        
        // 扩展构造函数---只能是便利构造函数,不可以是指定构造函数
        convenience init(center: Point, size: Size) {
            
            let originX = center.x - size.width/2
            let originY = center.y - size.height/2
            
            self.init(origin: Point(x: originX, y: originY), size: size)
        }
    }

     2 可以扩展嵌套类型、扩展下标

      嵌套类型:就是在一个类型中定义另外一个类型。

      如下可以看到,枚举Theme是在类里面定义的,这个Theme其实就是嵌套类型。 

    class UI {    
        enum Theme {
            case DayMode
            case NightMode
        }
    }
    extension Rectangle {
    
        // 扩展类型嵌套
        enum Vertex: Int {
            case LeftTop
            case RightTop
            case LeftBottom
            case RightBottom
        }
        
        func pointAtVertex(v: Vertex) -> Point {
            switch (v) {
            case .LeftTop:
                return origin
            case .RightTop:
                return Point(x: origin.x + size.width, y: origin.y)
            case .LeftBottom:
                return Point(x: origin.x, y: origin.y + size.height)
            case .RightBottom:
                return Point(x: origin.x + size.width, y: origin.y + size.height)
            }
        }
        
        // 扩展下标
        subscript(index: Int) -> Point {
            
            assert(index >= 0 && index < 4, "Index out of range.")
            
            return pointAtVertex(v: Vertex(rawValue: index)!)
        }
    }

    3 对系统类进行扩展----对Int扩展(这其实就是函数式编程的思想)

    extension Int {
        
        // 平方
        var square: Int {
            return self * self
        }
        
        // 立方
        var cude: Int {
            return self * self * self
        }
        
        //将“num >= 0 && num < 20”这种判断扩展为一个方法
        func inRange(closedLeft: Int, openRight: Int) -> Bool {
            return self >= closedLeft && self < openRight
        }
        
        // 将“for i in 0 ..< num”这种循环扩展为一个方法
        func repetitions(task: (Int) -> ()) {
            
            for i in 0 ..< self {
                task(i)
            }
        }    
    }
    
    var num = 8
    8.square
    8.cude
    
    num >= 0 && num < 20
    8.inRange(closedLeft: 0, openRight: 20)
    
    for i in 0 ..< num {
        print("Hello----(i)")
    }
    num.repetitions { i in
        print("Hello----(i)")
    }
  • 相关阅读:
    iPhone 上利用MKMapView实现简单地图的方法
    项目经理:做好项目开始阶段的九条经验(1) 项目 技术应用
    iPhone的Push(推送通知)功能原理浅析
    iPhone拍照/摄像软件开发实例
    每位开发人员都应铭记的10句编程谚语
    注册itunes 中国区app Store账号详细步骤
    [转载]:各位技术牛人和应届毕业生,外企是唯一的选择吗?
    [推荐] IT外企那点儿事(1):外企也就那么回事[
    CheckBox全选与不全选(不用刷新页面)
    CheckBox的全选与不全选(刷新页面效果) .
  • 原文地址:https://www.cnblogs.com/muzijie/p/6595124.html
Copyright © 2011-2022 走看看