swift 扩展可为枚举、结构体、类、协议添加方法、计算属性、下标、便捷初始化器、嵌套类型、协议等。
// 为系统类、结构体、枚举等添加计算属性
extension Double {
var km: Double { self * 1_000.0 }
var m: Double { self }
var dm: Double { self / 100.0 }
var cm: Double { self / 10.0 }
var mm: Double { self / 1_000.0 }
}
// 使用
var d = 100.0
print(d.km)
swift 扩展不能修改原来的内存结构
// 防止越界崩溃
extension Array {
subscript(nullable idx: Int) -> Element? {
if (startIndex..<endIndex).contains(idx) {
return self[idx]
}
return nil
}
}
// 使用
var arr: Array<Int> = [10, 20, 30]
arr[10]
swift扩展协议,实现协议可选方法,swift协议默认是必须实现的,没有可选方法
protocol TestProtocol {
func run()
func run3()
}
extension TestProtocol {
func run() {
print("run")
}
func run1() {
print("run1")
}
}
// 使用
class TestRun: TestProtocol {
// 如果没有实现run3则会报错,而run、run1不用实现,因为协议扩展实现了
func run3() {
print("run3")
}
}
var cls = TestRun()
cls.run()
cls.run1()
swift扩展泛型
class Stack<E> {
var elements = [E]()
func push(_ element: E) {
elements.append(element)
}
func pop() -> E { elements.removeLast() }
func size() -> Int { elements.count } }
// 扩展中依然可以使用原类型中的泛型类型
extension Stack {
func top() -> E { elements.last! }
}
// 符合条件才扩展
extension Stack : Equatable where E : Equatable {
static func == (left: Stack, right: Stack) -> Bool {
left.elements == right.elements
} }