扩展是一种轻量级继承机制
扩展是在原始类(枚举、结构体)的基础上添加新功能,它是一种轻量级继承机制,即使原始类型被限制继承,我们仍然可以通过扩展机制“继承”原始类的功能。它的另一个优势是,它扩展的可以是枚举、结构体和类,而继承只能是类。
声明扩展
扩展语法:
extension 类型名称 {
//添加功能
}
在swift中,我们不仅可以扩展类、枚举、结构体。也可以扩展整形、浮点型、布尔类型、字符串等基本数据类型。因为这些类型本质上也是结构体类型。
swift扩展机制可以在原始类型中添加的新功能包括:
- 实例计算属性和静态计算属性
- 实例方法和静态方法
- 构造函数
- 下标
扩展计算属性
扩展中不可以定义存储属性,但是可以定义计算属性(实例计算属性和静态计算属性)。
实例计算属性代码示例:
extension Int {
var errorMsg: String {
var error = ""
switch self {
case -1:
error = "没有数据"
case 0:
error = "网络错误"
case 1:
error = "数据正常"
default:
error = "其他"
}
return error
}
}
print((-1).errorMsg)
静态计算属性示例代码
extension Int {
static var height: Float {
return 100
}
}
print(Int.height)
扩展方法
扩展方法的几种情况如下:
extension Double {
static var interestRate = 0.668
//定义实例方法
func interestBy1() -> Double {
return self * Double.interestRate
}
//声明可变方法将结构赋给当前实例
mutating func interestBy2() {
self = self * Double.interestRate
}
//定义静态方法
static func interestBy3(amount: Double) -> Double {
return amount * interestRate
}
}
扩展构造函数
- 值类型扩展构造函数
值类型构造函数扩展和扩展方法没有区别,实例如下:
struct Rectangle {
var width: Double
var height: Double
init(width: Double, height: Double) {
self.width = width
self.height = height
}
}
extension Rectangle {
init(length: Double) {
self.init(width: length, height: length)
}
}
- 引用类型扩展构造函数
扩展类的时候能向类中添加新的便利构造函数,但是不能添加新的指定构造函数或者是析构函数。指定构造函数和析构函数只能由原始类提供。
代码示例如下:
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
extension Person {
convenience init(name: String) {
self.init(name: name, age: 18)
}
}
扩展下标
我们可以把下标理解为特殊的属性,可是实现索引访问属性。可以在原始类的基础上拓展下标功能。
下面以扩展字符串通过下标访问字符的功能。
extension String {
subscript(index: Int) -> String {
guard (index <= self.characters.count) else {
return ""
}
var c = ""
var i = 0
for character in self.characters {
if i == index {
c = String(character)
break
}
i += 1
}
return c
}
}
let str = "qwer"
let s = str[3] // s = r