Swift Extension扩展得使用详细介绍

 更新时间:2022年09月13日 14:56:52   作者:扑腾的蛾子  
在swift中,extension与Objective-C的category有点类似,但是extension比起category来说更加强大和灵活,它不仅可以扩展某种类型或结构体的方法,同时它还可以与protocol等结合使用,编写出更加灵活和强大的代码

扩展(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<Int> = [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..<self {
            task()
        }
    }
    enum Kind {
        case negative, zero, positive
    }
    var kind: Kind {
        switch self {
        case 0: return .zero
        case let x where x > 0: return.positive
        default: return .negative
        }
    }
    subscript(digitIndex: Int) -> Int {
        var decimalBase = 1
        for _ in 0..<digitIndex {
            decimalBase *= 10
        }
        return (self / decimalBase) % 10
    }
}

协议与初始化器

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

到此这篇关于Swift Extension扩展得使用详细介绍的文章就介绍到这了,更多相关Swift Extension内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Swift解决UITableView空数据视图问题的简单方法

    Swift解决UITableView空数据视图问题的简单方法

    这篇文章主要给大家介绍了关于Swift解决UITableView空数据视图问题的简单方法,文中通过示例代码介绍的非常详细,对大家学习或者使用swift具有一定的参考学习价值,需要的朋友可以参考下
    2018-10-10
  • Swift教程之函数详解

    Swift教程之函数详解

    这篇文章主要介绍了Swift教程之函数详解,本文讲解了函数的声明与调用、函数的参数和返回值、函数参数名、函数类型等内容,需要的朋友可以参考下
    2015-01-01
  • Swift 基本数据类型详解总结

    Swift 基本数据类型详解总结

    在我们使用任何程序语言编程时,需要使用各种数据类型来存储不同的信息。变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。在声明变量时也可指定它的数据类型。所有变量都具有数据类型,以决定能够存储哪种数据
    2021-11-11
  • Swift算法实现字符串转数字的方法示例

    Swift算法实现字符串转数字的方法示例

    最近学完了swift想着实践下,就通过一些简单的算法进行学习研究,下面这篇文章主要介绍了Swift算法实现字符串转数字的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-03-03
  • 超全面的Swift编码规范(推荐)

    超全面的Swift编码规范(推荐)

    这篇文章主要给大家介绍了关于Swift编码规范的相关资料,文中介绍的非常详细,对大家开发swift具有一定的参考价值,需要的朋友可以参考学习,下面来一起看看吧。
    2017-03-03
  • Swift泛型Generics浅析讲解

    Swift泛型Generics浅析讲解

    泛型代码让你能根据你所定义的要求,写出可以用于任何类型的灵活的、可复用的函数。泛型是 Swift 最强大的特性之一,很多 Swift 标准库是基于泛型代码构建的
    2022-08-08
  • switch多选择结构、循环结构示例详解

    switch多选择结构、循环结构示例详解

    这篇文章主要介绍了switch多选择结构、循环结构,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • 深入理解Swift中单例模式的替换及Swift 3.0单例模式的实现

    深入理解Swift中单例模式的替换及Swift 3.0单例模式的实现

    这篇文章主要给大家介绍了关于Swift中单例模式替换的相关资料,然后又跟大家分享了关于Swift3.0 单例模式实现的几种方法-Dispatch_Once的内容,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-11-11
  • Swift仿选择电影票的效果并实现无限/自动轮播的方法

    Swift仿选择电影票的效果并实现无限/自动轮播的方法

    这篇文章主要给大家介绍了关于Swift仿选择电影票的效果并实现无限/自动轮播的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • Swift中图片资源使用流程的优化方法详解

    Swift中图片资源使用流程的优化方法详解

    这篇文章主要给大家介绍了关于Swift中图片资源使用流程的优化方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01

最新评论