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)")
    }
  • 相关阅读:
    Vasya and Endless Credits CodeForces
    Dreamoon and Strings CodeForces
    Online Meeting CodeForces
    数塔取数 基础dp
    1001 数组中和等于K的数对 1090 3个数和为0
    1091 线段的重叠
    51nod 最小周长
    走格子 51nod
    1289 大鱼吃小鱼
    POJ 1979 Red and Black
  • 原文地址:https://www.cnblogs.com/muzijie/p/6595124.html
Copyright © 2011-2022 走看看