首页 > 其他分享 >Swift 中 extension 的使用

Swift 中 extension 的使用

时间:2023-03-14 17:34:30浏览次数:35  
标签:run extension 代码 添加 使用 类型 Swift 属性

在 Swift 中,extension 是一种非常有用的语言特性,它可以为一个已有的类型(包括类、结构体和枚举)添加新的属性、方法、下标和协议等功能,而无需修改原始类型的定义。使用 extension 可以让我们更加方便地扩展和修改现有的代码,同时也可以使代码更加清晰和易读。

下面是一些 extension 的使用示例:

1. 为类型添加新的方法

extension Int {
    func times(_ closure: () -> Void) {
        for _ in 0..<self {
            closure()
        }
    }
}

3.times { print("Hello") } // 输出三次 "Hello"

在上面的代码中,我们为 Int 类型添加了一个名为 times 的方法,这个方法接受一个闭包作为参数,并在闭包中执行指定次数的操作。在调用时,我们可以使用 3.times { print("Hello") } 的语法来输出三次 "Hello"。

2. 为类型添加新的计算属性

extension Double {
    var squared: Double {
        return self * self
    }
}

let x = 3.0
let y = x.squared // y 的值为 9.0

在上面的代码中,我们为 Double 类型添加了一个名为 squared 的计算属性,这个属性返回当前值的平方。在调用时,我们可以使用 x.squared 的语法来计算 x 的平方并将结果赋值给 y

3. 为类型添加新的下标

extension Array {
    subscript(safe index: Int) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }
}

let array = [1, 2, 3]
let element = array[safe: 10] // element 的值为 nil

在上面的代码中,我们为 Array 类型添加了一个名为 safe 的下标,这个下标接受一个整数作为参数,并返回数组中对应索引位置的元素(如果该索引位置存在的话),否则返回 nil。在调用时,我们可以使用 array[safe: 10] 的语法来获取数组中索引为 10 的元素,由于该索引位置不存在,因此返回值为 nil

4. 为类型遵循新的协议

protocol Runnable {
    func run()
}

extension UIViewController: Runnable {
    func run() {
        print("ViewController is running")
    }
}

let viewController = UIViewController()
viewController.run() // 输出 "ViewController is running"

在上面的代码中,我们为 UIViewController 类型遵循了一个名为 Runnable 的协议,并为该类型添加了一个 run 方法。在调用时,我们可以使用 viewController.run() 的语法来执行 ViewController 中的 run 方法,并输出 "ViewController is running"。

总之,extension 是一种非常有用的语言特性,可以让我们更加灵活地扩展和修改现有的代码,从而提高开发效率和代码质量。

问题:你能通过extension(扩展)保存一个属性吗?请解释一下原因。

在 Swift 中,我们可以使用 extension 来为一个已有的类型添加新的属性和方法。但是,我们不能使用 extension 来添加存储属性,因为存储属性必须在类型的定义中进行声明。

因为 extension 是在类型的定义之外添加新的功能,它只能添加计算属性,也就是只有 getter 和 setter 方法的属性,而没有实际的存储空间来存储属性值。因此,如果我们在 extension 中尝试添加一个存储属性,编译器会提示错误。

下面是一个示例代码:

struct Person {
    var name: String
}

extension Person {
    var age: Int // 编译错误:Extensions must not contain stored properties
}

在上面的代码中,我们尝试在 Person 结构体的 extension 中添加一个 age 属性,但是编译器会提示错误,因为我们不能在 extension 中添加存储属性。

不过,我们可以在 extension 中添加计算属性,这些属性会在每次访问时计算出一个值,如下所示:

extension Person {
    var fullName: String {
        return "\(name)"
    }
}

在上面的代码中,我们在 Person 结构体的 extension 中添加了一个 fullName 计算属性,这个属性只有 getter 方法,每次访问时都会计算出一个完整的姓名并返回。

标签:run,extension,代码,添加,使用,类型,Swift,属性
From: https://www.cnblogs.com/samniu/p/17215685.html

相关文章

  • Swift 中的static 和 class 关键字使用及区别
    在Swift中,static和class关键字都可以用来修饰类的属性和方法,但它们之间有三个主要的区别:继承性:使用class修饰的属性和方法可以被子类重写,而使用static修饰的属......
  • 使用iptabels将主机的所有流量转发至其他机器
    iptables是一个Linux内核中的包过滤工具,可以用来过滤、转发、修改、控制网络流量等。如果想要将主机的所有流量转发至其他机器,可以使用iptables进行配置。以下是具体步骤:......
  • axios接口的使用
    axios接口的使用配置axiosnpmiaxios-S一、基础方法①创建@src/utils/request.js,封装importaxiosfrom'axios'constrequest=axios.create({//指定请......
  • Swift与Objective-C常量定义的不同
    在Objective-C中,使用const关键字定义的常量是在编译时被解析的,它们的值是静态的,不能在运行时改变。同时,这种方式定义的常量需要通过C语言的方式来访问和使用。而在......
  • L298N 5V使能跳帽使用详解
      5V使能引脚,即图中5VEnable引脚。该引脚与5VPower引脚息息相关,因此首先需要知道5VPower引脚的功能。L298N的5VPower引脚目的是给L298芯片供电(注意:不是给电机供......
  • ELK安装及简单使用
    一、Elasticsearch集群1.1内核参数优化:#vim/etc/sysctl.confvm.max_map_count=2621441.2:主机名解析192.168.84.132es1es1.example.com192.168.84.133es2es......
  • kaptcha验证码使用
    kaptcha介绍Kaptcha是一个可高度配置的实用验证码生成工具,已经存在很久了,比较稳定,可自由配置的选项如:1.验证码的字体2.验证码字体的大小3.验证码字体的字体颜色4.验......
  • 使用简略语法传入 lambda 值参
    在Kotlin中,可以使用简略语法传入Lambda表达式作为函数的参数。如果函数的最后一个参数是一个Lambda表达式,那么可以将该表达式写在调用括号外面,并使用大括号{}包裹......
  • shell使用-awk
    工作原理:当读到第一行时,匹配条件,然后执行指定动作,再接着读取第二行数据处理,不会默认输出。如果没有定义匹配条件默认是匹配所有数据行,awk隐含循环,条件匹配多少次动作就会执......
  • java8 Optional使用 stream filter多级过滤
    java8Optional使用streamfilter多级过滤packagecom.example.core.mydemo.java8;publicclassMyModel{privateStringcouponCode;privateIntegeror......