21.扩展

摘要:
双{returnself*1.000.0;y=0.0}structRect{varorigin=Point()varsize=Size()}extensionRect{//构造函数init(center:

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

免责声明:文章转载自《21.扩展》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【291】Python 中字符串添加到剪贴板selenium(六)Headless Chrome/Firefox--PhantomJS停止支持后,使用无界面模式。下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring Boot 使用 XXL-JOB

一、配置部署调度中心 1.1 下载源码 https://github.com/xuxueli/xxl-job 1.2 数据库初始化 执行 /xxl-job/doc/db/tables_xxl_job.sql 1.3 修改配置 /xxl-job/xxl-job-admin/src/main/resources/application.properties...

OpenCV 环境搭建( Win7 32位 / VS2010 / OpenCV2.4.8 )

前言   本文介绍如何搭建 OpenCV 开发环境   配置如下:     操作系统:WIN7 32位     开发平台:VS2010     OpenCV 版本:2.4.8 第一步:安装 OpenCV 2.4.8   1. 登陆 OpenCV 官方网站:http://opencv.org/,获取 Windows 版本的 OpenCV 安装程序,文件名为...

从数据库中取时间值,报错:java.sql.Timestamp cannot be cast to java.lang.Long

从数据库中取时间值,报错:java.sql.Timestamp cannot be cast to java.lang.Long 1、问题描述 将数据库中的查询到的 timestamp类型的数据,转成 Long类型报错。 String type = result.getClass().getName(); if ("java.sql.Timstamp"....

Zabbix 监控主机

添加自身为被监控主机         先添加再更新        添加 windows 主机 windows10 Windows 解压 zabbix_agents_3.2.0.win.zip 1、首先在 C 盘根目录下创建 zabbix 的文件夹 2、将需要的文件拖到该文件夹内(bin/win64) 3、修改 windows 配置文件(zabbix.ag...

Protobuf3 语法指南

  目录 [−] 定义一个消息类型 指定字段类型 分配标识号 指定字段规则 添加更多消息类型 添加注释 保留标识符(Reserved) 从.proto文件生成了什么? 标量数值类型 默认值 枚举 使用其他消息类型 导入定义 使用proto2消息类型 嵌套类型 更新一个消息类型 Any Oneof 使用Oneof Oneof 特性 向后兼...

es常见的字段映射类型之二进制类型(binary)

概念 二进制数据类型。该binary类型接受二进制值作为 Base64编码的字符串。该字段默认情况下不存储,并且不可搜索。 该类型的字段可以作为对es的补充了解,实际开发中使用的较少。 示例使用 1、映射定义 PUT example PUT example/docs/_mapping { "properties": { "id":{...