扩展extension

94 阅读1分钟

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
} }