zoukankan      html  css  js  c++  java
  • 21.扩展

      扩展 就是为一个已有的类、结构体、枚举类型或者协议类型添加新功能。这包括在没有权限获取原始源代码的情况下扩展类型的能力(即 逆向建模 )。扩展和 Objective-C 中的分类类似。

      Swift 中的扩展可以:

    1.  添加计算型属性和计算型类型属性
    2.  定义实例方法和类型方法
    3.  提供新的构造器
    4.  定义下标
    5.  定义和使用新的嵌套类型
    6.  使一个已有类型符合某个协议

    1.扩展语法

      如果通过扩展为一个已有类型添加新功能,那么新功能对该类型的所有已有实例都是可用的,即使它们是在这个扩展定义之前创建的。

    extension SomeType {
        // 为 SomeType 添加的新功能写到这里
    }
    
    //扩展类型时让类型遵守协议
    extension SomeType: SomeProtocol, AnotherProctocol {
        // 协议实现写到这里
    }

    2.计算型属性

      扩展可以添加新的计算属性,但是不可以添加存储属性,也不可以向已有属性添加属性观测器

    extension Double
    {
        var km: Double { return self * 1_000.0; }
        var m : Double { return self; }
        var cm: Double { return self / 100.0; }
        var mm: Double { return self / 1_000.0; }
        var ft: Double { return self / 3.28084; }
    }
    let oneInch = 25.4.mm;

    3.构造器

    struct Size {
        var width = 0.0, height = 0.0
    }
    struct Point {
        var x = 0.0, y = 0.0
    }
    struct Rect {
        var origin = Point()
        var size = Size()
    }
    
    extension Rect {
        //扩展添加的构造器
        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)
        }
    }
     
    let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
     size: Size( 3.0, height: 3.0));

    4.方法

    extension Int
    {
        //扩展添加的方法
        func repetitions(task: () -> Void)
        {
            for _ in 0..<self
            {
                task();
            }
        }
    }
    
    //重要的事情说三遍.....
    3.repetitions{
        print("Goodbye!");
    };

    5.下标

    extension Int
    {
        //扩展添加下标
        subscript(digitIndex: Int) -> Int
        {
            var decimalBase = 1;
            for _ in 0..<digitIndex
            {
                decimalBase *= 10;
            }
            return (self / decimalBase) % 10;
        }
    }
    print("(123456[1])");  //"5
    "

    6.嵌套类型

    extension Int
    {
        //嵌套的枚举类型Kind
        enum Kind
        {
            case Negative;
            case Zero;
            case Positive;
        }
        
        var kind: Kind
        {
            switch self
            {
            case 0:  //0
                return .Zero;
            case let x where x > 0:  //正数
                return .Positive;
            default:  //负数
                return .Negative;
            }
        }
    }
    print("((-3).kind)");  //"Negative
    "
  • 相关阅读:
    Codeforces Round #652 (Div. 2)
    Codeforces Round #651 (Div. 2)
    The 2017 China Collegiate Programming Contest, Qinhuangdao Site
    2017中国大学生程序设计竞赛-哈尔滨站
    Codeforces Global Round 8
    [CF768D] Jon and Orbs
    2020牛客暑期多校训练营(第一场)I
    2020牛客暑期多校训练营(第一场)F
    [HDU5769] Substring
    [PA2010] Riddle
  • 原文地址:https://www.cnblogs.com/LeeGof/p/5682629.html
Copyright © 2011-2022 走看看