swift extension扩展得使用详细介绍-kb88凯时官网登录

来自:网络
时间:2023-07-25
阅读:
目录

扩展(extension)

1、swift中的扩展,有点类似于oc中的分类(category)

2、扩展可以为枚举、结构体、类、协议添加新功能

可以添加方法、计算属性、下标、(便捷)初始化器、嵌套类型、协议等等

3、扩展不能办到的事情

不能覆盖原有的功能

不能添加存储属性,不能向已有的属性添加属性观察器

不能添加父类

不能添加指定初始化器,不能添加反初始化器

。。。。

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
d.km
d.m
d.dm
var arr: array = [10, 20, 30]
extension array {
    subscript(nullable idx: int) -> element? {
        if (startindex ..< endindex).contains(idx) {
            return self[idx]
        }
        return nil
    }
}
print(arr[nullable: 1] ?? 0)
extension int {
    func repeats(task: () -> void) {
        for _ in 0.. 0: return.positive
        default: return .negative
        }
    }
    subscript(digitindex: int) -> int {
        var decimalbase = 1
        for _ in 0..

协议与初始化器

class person {
    var age: int
    var name: string
    init(age: int, name: string) {
        self.age = age
        self.name = name
    }
}
extension person: equatable {
    static func == (left: person, right: person) -> bool {
        left.age == right.age && left.name == right.name
    }
    convenience init() {
        self.init(age: 0, name: "")
    }
}

1、如果希望自定义初始化器的同时,编译器也能够生成默认初始化器,那么可以在扩展中编写自定义初始化器

struct point {
    var x: int = 0
    var y: int = 0
}
extension point {
    init(_ point: point) {
        self.init(x: point.x, y: point.y)
    }
}

2、required初始化器不能写在扩展中

协议

1、如果一个类型已经实现了协议的所有要求,但是还没有声明它遵守了这个协议

可以通过扩展来让它遵守这个协议

2、给协议进行扩展后,凡是遵守了这个协议的都会有对应的扩展方法,以下面为例,编写一个函数,判断一个证书是否为奇数。

extension binaryinteger {
    func isodd() -> bool {
        self % 2 != 0
    }
}

3、扩展可以给协议提供默认实现,也间接实现 可选协议 的效果

protocol testprotocol {
    func test1()
}
extension testprotocol {
    func test1() {
        print("testprotocol test1")
    }
    func test2() {
        print("testprotocol test2")
    }
}
class testclass: testprotocol {
    func test1() {
        print("testclass test1")
    }
    func test2() {
        print("testclass test2")
    }
}
var cls: testprotocol = testclass()
cls.test1() //testclass test1
cls.test2() //testprotocol test2

泛型

1、扩展中依然可以使用原类型中的泛型类型

2、符合条件才扩展

extension stack: equatable where e: equatable {
}
返回顶部
顶部
网站地图