编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 01.Swift基础语法
  • 02.运算符和流程控制
  • 03.函数与闭包
  • 04.高级运算符和枚举
  • 05.类和结构体
  • 06.属性&方法&构造
  • 07.内存管理和异常
  • 08.拓展&泛型&协议

08.拓展&泛型&协议

目录介绍

  • 8.1 拓展
    • 8.1.1 什么是拓展
    • 8.1.2 拓展语法
    • 8.1.3 拓展属性
    • 8.1.4 拓展构造器
    • 8.1.5 拓展方法
    • 8.1.6 拓展可变实例方法
  • 8.2 泛型
  • 8.3 协议
    • 8.3.1 什么是协议
    • 8.3.2 协议语法
    • 8.3.3 协议的使用
    • 8.3.4 协议的继承

8.1 拓展

8.1.1 什么是拓展

扩展就是向一个已有的类、结构体或枚举类型添加新功能。

扩展可以对一个类型添加新的功能,但是不能重写已有的功能。Swift 中的扩展可以:

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

8.1.2 拓展语法

扩展声明使用关键字 extension:

extension SomeType {
    // 加到SomeType的新功能写到这里
}

一个扩展可以扩展一个已有类型,使其能够适配一个或多个协议,语法格式如下:

extension SomeType: SomeProtocol, AnotherProctocol {
    // 协议实现写到这里
}

8.1.3 拓展属性

扩展可以向已有类型添加计算型实例属性和计算型类型属性。

extension Int {
   var add: Int {return self + 100 }
   var sub: Int { return self - 10 }
}
    
let addition = 3.add
print("加法运算后的值:\(addition)")
    
let subtraction = 120.sub
print("减法运算后的值:\(subtraction)")

8.1.4 拓展构造器

扩展可以向已有类型添加新的构造器。

这可以让你扩展其它类型,将你自己的定制类型作为构造器参数,或者提供该类型的原始实现中没有包含的额外初始化选项。

扩展可以向类中添加新的便利构造器 init(),但是它们不能向类中添加新的指定构造器或析构函数 deinit() 。

struct Point {
    var x: Int
    var y: Int
}

extension Point {
    // 添加一个构造器
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

// 使用拓展中的构造器创建Point实例
let point = Point(x: 10, y: 20)
print(point.x) // 输出: 10
print(point.y) // 输出: 20

在上面的示例中,我们定义了一个名为Point的结构体,它具有x和y两个整数属性。然后,我们使用拓展为Point添加了一个构造器,该构造器接受x和y作为参数,并将其分配给相应的属性。

8.1.5 拓展方法

扩展可以向已有类型添加新的实例方法和类型方法。

struct Point {
    var x: Int
    var y: Int
}

extension Point {
    // 添加一个方法
    func printCoordinates() {
        print("Coordinates: (\(x), \(y))")
    }
}

// 使用拓展中的方法
let point = Point(x: 10, y: 20)
point.printCoordinates() // 输出: Coordinates: (10, 20)

在上面的示例中,我们定义了一个名为Point的结构体,它具有x和y两个整数属性。然后,我们使用拓展为Point添加了一个名为printCoordinates的方法,该方法用于打印坐标。

通过拓展中的方法,我们可以在Point实例上调用printCoordinates方法,而不需要修改Point结构体的定义。

8.1.6 拓展可变实例方法

通过扩展添加的实例方法也可以修改该实例本身。

结构体和枚举类型中修改self或其属性的方法必须将该实例方法标注为mutating,正如来自原始实现的修改方法一样。

下面的例子向 Swift 的 Double 类型添加了一个新的名为 square 的修改方法,来实现一个原始值的平方计算:

extension Double {
   mutating func square() {
      let pi = 3.1415
      self = pi * self * self
   }
}

var Trial1 = 3.3
Trial1.square()
print("圆的面积为: \(Trial1)")


var Trial2 = 5.8
Trial2.square()
print("圆的面积为: \(Trial2)")

8.3 协议

8.3.1 什么是协议

协议规定了用来实现某一特定功能所必需的方法和属性。

任意能够满足协议要求的类型被称为遵循(conform)这个协议。类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。

Swift 协议(Protocols)是定义方法、属性和其他要求的蓝图,适用于特定任务或功能。协议可以被类、结构体和枚举采纳,并提供这些需求的具体实现。

协议提供了一种约定,用于定义类型之间的通信和交互方式。

8.3.2 协议语法

协议的语法格式如下:

protocol SomeProtocol {
    // 这里可以定义协议要求
    var someProperty: Int { get set }
    func someMethod()
}

SomeProtocol 定义了一个可读写的属性 someProperty 和一个方法 someMethod。

8.3.3 协议的使用

类实现协议,让它遵循MyProtocol协议。我们实现了name属性和sayHello()方法。

class MyClass: MyProtocol {
    var name: String = ""
    
    func sayHello() {
        print("Hello, \(name)!")
    }
}

使用协议,创建了一个MyProtocol类型的变量obj,并将其赋值为MyClass的实例。我们可以通过obj访问name属性和sayHello()方法。

let obj: MyProtocol = MyClass()
obj.name = "John"
obj.sayHello() // 输出:Hello, John!

8.3.4 协议的继承

贡献者: yangchong211
上一篇
07.内存管理和异常