IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Swift基础入门知识学习(23)-扩展-讲给你懂 -> 正文阅读

[移动开发]Swift基础入门知识学习(23)-扩展-讲给你懂

小心!逻辑思维陷阱-重点笔记

Swift基础入门知识学习(22)-类型转换(型别转换)-讲给你懂


理解难度
★★★★☆
实用程度
★★★★☆

扩展(extension)是 Swift 一个重要的特性,它可以为已存在的枚举、结构体、类别和协议添加新功能,而且不需要修改该类型原本定义的代码。扩展也可以使用在内建的类型上,像是Int、Double或String等等。

扩展允许你将方法添加到现有类型中,以使其做最初设计不做的事情。

Swift 的扩展可以:

  • 新增计算属性(包含实例属性和类型属性)。
  • 定义实例方法和类型方法(不能重写已存在的方法)。
  • 提供新的构造器。
  • 定义下标。
  • 定义和使用新的嵌套类型(巢状类型)。
  • 让一个已存在的类型遵循某个协议。

扩展语法

使用extension关键字来定义一个扩展,格式如下:

extension 某个类型 {
    新增的代码内容
}

当你对一个已存在的类型新增一个扩展之后,扩展的新功能可以立即给该类型的所有实例使用,即使这个实例在定义扩展前就已经生成了也是可以。

另外,扩展也可以让一个已有的类型遵循一个或多个协议,格式就如同结构体及类别一样:

extension 某个类型: 协议, 另一个协议, 又另一个协议 {
    新增的代码内容
}

计算属性

扩展可以对内建的类型增加计算实例属性与计算类型属性。下面例子为内建的Double类型增加了 3 个计算实例属性,用来表示常见的距离单位:

extension Double {
    var km: Double { return self * 1_000.0 }
    var m: Double { return self }
    var cm: Double { return self / 100.0 }
}

定义好新增的扩展之后,就可以直接使用,使用方法就如同普通的属性一样使用点语法再紧接着属性名称,如下:

// 直接对类型 Double 的值取得属性
let aMarathon = 42.km + 195.m

// 打印出:马拉松的距离全长为 42195.0 公尺
print("马拉松的距离全长为 \(aMarathon) 公尺")

扩展不能新增储存属性,也不能为已有的属性添加属性观察器(property observer)。

方法

扩展可以为已有的类型新增实例方法与类型方法。以下例子为内建的Int类型新增一个实例方法:

// 新增一个实例方法 有一个参数 类型为 () -> Void 的闭包
// 这个新增的实例方法会执行这个闭包
// 执行次数为:这个整数本身代表数字
extension Int {
    func repetitions(task: () -> Void) {
        for _ in 0..<self {
            task()
        }
    }
}

// 会依序打印出 3 次:Hello!
// 这边使用 尾随闭包 简化语法
3.repetitions {
    print("Hello!")
}

可变实例方法(变异实例方法)

扩展也可以新增变异实例方法,与一般变异方法一样在前面加上mutating关键字,下面例子为内建的Int类型新增一个变异实例方法:

// 为内建的 Int 类型新增一个变异实例方法:取得这个整数的平方数
extension Int {
    mutating func square() {
        self = self * self
    }
}

// 先声明一个整数
var oneInt = 5

// 接着呼叫方法 这里会得到 25
oneInt.square()

构造器(建构器)

扩展能为类别新增便利构造器(convenience initializer),但不能新增指定构造器(designated initializer)跟解构器(deinitializer)。

以下例子为一个结构体新增一个构造器。如果没有为结构体定义构造器时,结构体会有一个自动生成的成员逐一构造器(memberwise initializer),而这边因为是使用扩展为结构体新增构造器,所以原本的成员逐一构造器仍然可以使用:

// 定义一个结构体 会有一个自动生成的成员逐一构造器
struct GameCharacter {
    var hp = 100,mp = 100, name = ""
}

// 为结构体 GameCharacter 定义一个构造器的扩展
extension GameCharacter {
    init(name:String) {
        self.name = name
        print("新名字为 \(name)")
    }
}

// 使用扩展后定义的构造器
let oneChar = GameCharacter(name: "弓箭手")

// 原本的成员逐一构造器仍然可以使用
let twoChar = GameCharacter(hp: 200, mp: 50, name: "战士")

使用扩展新增一个新的构造器时,仍然需要确保建构过程中的每一个实例的完全初始化。

下标

扩展可以为已有的类型新增下标。下面例子为内建的Int类型增加下标:

// 定义下标 取得一个整数从个位数算起第几个数字
// 索引值:0 为取得个位数, 1 为取得十位数, 2为取得百位数 依此类推
extension Int {
    subscript(digitIndex: Int) -> Int {
        var decimalBase = 1
        for _ in 0..<digitIndex {
            decimalBase *= 10
        }
        return (self / decimalBase) % 10
    }
}

// 接着就可以得到每一个位数的数字
// 得到个位数:9
123456789[0]

// 得到千位数:6
123456789[3]

嵌套类型(巢状类型)

扩展可以为已有的枚举、结构体和类别新增嵌套类型(巢状类型)。以下为内建的 Int 类型内新增一个枚举的扩展:

// 为内建的 Int 类型内新增一个枚举的扩展
// 用来表示这个整数是负数、零还是正数
extension Int {
    enum Kind {
        case negative, zero, positive
    }

    // 另外还新增一个计算属性 用来返回枚举情况
    var kind: Kind {
        switch self {
        case 0:
            return .zero
        case let x where x > 0:
            return .positive
        default:
            return .negative
        }
    }
}

// 依序会打印出:positive、negative、zero
for number in [3, -12, 0] {
    print(number.kind)
}

扩展是一个好用的东西。也可以找到很多别人已经写好的扩展来用。

了解概念,就好拿别人的轮子来用。

Swift基础入门知识学习(22)-类型转换(型别转换)-讲给你懂

高效阅读-事半功倍读书法-重点笔记-不长,都是干货

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-16 17:47:32  更:2021-12-16 17:47:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:59:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码