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)")
    }
  • 相关阅读:
    OpenCV——Skewing
    OpenCV——PS滤镜算法之Spherize 球面化(凸出效果)
    机器学习 scikit-learn 图谱
    机器视觉 Histogram of oriented gradients
    Python: scikit-image canny 边缘检测
    机器视觉 Local Binary Pattern (LBP)
    Ice php配置
    Windows7下的免费虚拟机(微软官方虚拟机)
    经常使用的webservice接口
    怎样衡量一个公司是否靠谱
  • 原文地址:https://www.cnblogs.com/muzijie/p/6595124.html
Copyright © 2011-2022 走看看