- Swift 教程
- Swift - 首页
- Swift - 概述
- Swift - 环境
- Swift - 基本语法
- Swift - 变量
- Swift - 常量
- Swift - 字面量
- Swift - 注释
- Swift 运算符
- Swift - 运算符
- Swift - 算术运算符
- Swift - 比较运算符
- Swift - 逻辑运算符
- Swift - 赋值运算符
- Swift - 位运算符
- Swift - 其他运算符
- Swift 高级运算符
- Swift - 运算符重载
- Swift - 算术溢出运算符
- Swift - 恒等运算符
- Swift - 范围运算符
- Swift 数据类型
- Swift - 数据类型
- Swift - 整数
- Swift - 浮点数
- Swift - Double
- Swift - 布尔值
- Swift - 字符串
- Swift - 字符
- Swift - 类型别名
- Swift - 可选类型
- Swift - 元组
- Swift - 断言和前提条件
- Swift 控制流
- Swift - 决策制定
- Swift - if 语句
- Swift - if...else if...else 语句
- Swift - if-else 语句
- Swift - 嵌套 if 语句
- Swift - switch 语句
- Swift - 循环
- Swift - for in 循环
- Swift - while 循环
- Swift - repeat...while 循环
- Swift - continue 语句
- Swift - break 语句
- Swift - 穿透语句
- Swift 集合
- Swift - 数组
- Swift - 集合
- Swift - 字典
- Swift 函数
- Swift - 函数
- Swift - 嵌套函数
- Swift - 函数重载
- Swift - 递归
- Swift - 高阶函数
- Swift 闭包
- Swift - 闭包
- Swift-逃逸和非逃逸闭包
- Swift - 自动闭包
- Swift 面向对象编程
- Swift - 枚举
- Swift - 结构体
- Swift - 类
- Swift - 属性
- Swift - 方法
- Swift - 下标
- Swift - 继承
- Swift-重写
- Swift - 初始化
- Swift - 析构
- Swift 高级
- Swift - ARC 概述
- Swift - 可选链
- Swift - 错误处理
- Swift - 并发
- Swift - 类型转换
- Swift - 嵌套类型
- Swift - 扩展
- Swift - 协议
- Swift - 泛型
- Swift - 访问控制
- Swift - 函数与方法
- Swift - SwiftyJSON
- Swift - 单例类
- Swift 随机数
- Swift 不透明和装箱类型
- Swift 有用资源
- Swift - 在线编译
- Swift - 快速指南
- Swift - 有用资源
- Swift - 讨论
Swift - 扩展
什么是 Swift 中的扩展?
Swift 提供了一个称为扩展的特殊功能。扩展用于在现有的类、结构体、枚举或协议类型中添加新的功能,而无需覆盖或修改现有的代码。当我们想要扩展无法修改的类型的功能(例如第三方库等)时,此功能非常有用。扩展是对类型的静态添加,而不是动态的。此外,它们不能添加具有默认值的存储属性。
以下是扩展提供的功能:
添加计算属性和计算类型属性
定义实例方法和类型方法
提供新的初始化器
定义下标
定义和使用新的嵌套类型
使现有类型符合协议
在 Swift 中定义扩展
扩展是借助 **extension** 关键字声明的。
语法
以下是扩展的语法:
extension SomeType { // Adding new functionality }
现有类型也可以通过扩展添加,使其成为协议标准,其语法类似于类或结构体。
extension SomeType: SomeProtocol, AnotherProtocol { // Describe protocol requirements }
带有计算属性的扩展
计算“实例”和“类型”属性也可以通过扩展进行扩展。计算属性是指不存储值的属性,而是提供 getter 和 setter 来检索和设置其他属性和值。
示例
Swift 程序演示如何使用扩展在计算属性中添加新功能。
// Adding new functionality to the computed property using an extension extension Int { var add: Int {return self + 100 } var sub: Int { return self - 10 } var mul: Int { return self * 10 } var div: Int { return self / 5 } } let addition = 3.add print("Addition is \(addition)") let subtraction = 120.sub print("Subtraction is \(subtraction)") let multiplication = 39.mul print("Multiplication is \(multiplication)") let division = 55.div print("Division is \(division)") let mix = 30.add + 34.sub print("Mixed Type is \(mix)")
输出
它将产生以下输出:
Addition is 103 Subtraction is 110 Multiplication is 390 Division is 11 Mixed Type is 154
带有初始化器的扩展
Swift 提供了使用扩展向现有类型添加新初始化器的灵活性。用户可以添加他们自己的自定义类型来扩展已定义的类型,并且还可以提供额外的初始化选项。扩展仅支持 init()。deinit() 不受扩展支持。
示例
Swift 程序演示如何使用扩展在初始化器中添加新功能。
struct sum { var num1 = 100, num2 = 200 } struct diff { var no1 = 200, no2 = 100 } struct mult { var a = sum() var b = diff() } let calc = mult() print ("Inside mult block \(calc.a.num1, calc.a.num2)") print("Inside mult block \(calc.b.no1, calc.b.no2)") let memcalc = mult(a: sum(num1: 300, num2: 500),b: diff(no1: 300, no2: 100)) print("Inside mult block \(memcalc.a.num1, memcalc.a.num2)") print("Inside mult block \(memcalc.b.no1, memcalc.b.no2)") extension mult { init(x: sum, y: diff) { let X = x.num1 + x.num2 let Y = y.no1 + y.no2 } } let a = sum(num1: 100, num2: 200) print("Inside Sum Block:\( a.num1, a.num2)") let b = diff(no1: 200, no2: 100) print("Inside Diff Block: \(b.no1, b.no2)")
输出
它将产生以下输出:
Inside mult block (100, 200) Inside mult block (200, 100) Inside mult block (300, 500) Inside mult block (300, 100) Inside Sum Block:(100, 200) Inside Diff Block: (200, 100)
带有方法的扩展
可以使用扩展向子类进一步添加新的实例方法和类型方法。
示例
Swift 程序演示如何使用扩展在方法中添加新功能。
extension Int { func topics(summation: () -> ()) { for _ in 0..<self { summation() } } } 4.topics({ print("Inside Extensions Block") }) 3.topics({ print("Inside Type Casting Block") })
输出
它将产生以下输出:
Inside Extensions Block Inside Extensions Block Inside Extensions Block Inside Extensions Block Inside Type Casting Block Inside Type Casting Block Inside Type Casting Block
带有可变实例方法的扩展
我们还可以使用扩展向结构体和枚举的可变实例方法中添加新功能。
示例
Swift 程序演示如何使用扩展在可变方法中添加新功能。
extension Double { mutating func square() { let pi = 3.1415 self = pi * self * self } } var Trial1 = 3.3 Trial1.square() print("Area of circle is: \(Trial1)") var Trial2 = 5.8 Trial2.square() print("Area of circle is: \(Trial2)") var Trial3 = 120.3 Trial3.square() print("Area of circle is: \(Trial3)")
输出
它将产生以下输出:
Area of circle is: 34.210935 Area of circle is: 105.68006 Area of circle is: 45464.070735
带有下标的扩展
向已声明的实例添加新的下标也可以通过扩展实现。
示例
Swift 程序演示如何使用扩展在下标中添加新功能。
extension Int { subscript(var multtable: Int) -> Int { var no1 = 1 while multtable > 0 { no1 *= 10 --multtable } return (self / no1) % 10 } } print(12[0]) print(7869[1]) print(786543[2])
输出
它将产生以下输出:
2 6 5
带有嵌套类型的扩展
类、结构体和枚举实例的嵌套类型也可以通过扩展进行扩展。
示例
Swift 程序演示如何使用扩展在嵌套类型中添加新功能。
extension Int { enum calc { case add case sub case mult case div case anything } var print: calc { switch self { case 0: return .add case 1: return .sub case 2: return .mult case 3: return .div default: return .anything } } } func result(numb: [Int]) { for i in numb { switch i.print { case .add: print(" 10 ") case .sub: print(" 20 ") case .mult: print(" 30 ") case .div: print(" 40 ") default: print(" 50 ") } } } result(numb: [0, 1, 2, 3, 4, 7])
输出
它将产生以下输出:
10 20 30 40 50 50