扩展

作者: 随心_追梦 | 来源:发表于2018-01-04 08:20 被阅读0次

扩展是一种轻量级继承机制

扩展是在原始类(枚举、结构体)的基础上添加新功能,它是一种轻量级继承机制,即使原始类型被限制继承,我们仍然可以通过扩展机制“继承”原始类的功能。它的另一个优势是,它扩展的可以是枚举、结构体和类,而继承只能是类。

声明扩展

扩展语法:

extension 类型名称 {
    //添加功能
}

在swift中,我们不仅可以扩展类、枚举、结构体。也可以扩展整形、浮点型、布尔类型、字符串等基本数据类型。因为这些类型本质上也是结构体类型。

swift扩展机制可以在原始类型中添加的新功能包括:

  • 实例计算属性和静态计算属性
  • 实例方法和静态方法
  • 构造函数
  • 下标

扩展计算属性

扩展中不可以定义存储属性,但是可以定义计算属性(实例计算属性和静态计算属性)。
实例计算属性代码示例:

extension Int {
    var errorMsg: String {
        var error = ""
        switch self {
        case -1:
            error = "没有数据"
        case 0:
            error = "网络错误"
        case 1:
            error = "数据正常"
        default:
            error = "其他"
        }
        return error
    }
}
print((-1).errorMsg)

静态计算属性示例代码

extension Int {
    static var height: Float {
        return 100
    }
}
print(Int.height)

扩展方法

扩展方法的几种情况如下:

extension Double {
    static var interestRate = 0.668
    //定义实例方法
    func interestBy1() -> Double {
        return self * Double.interestRate
    }
    //声明可变方法将结构赋给当前实例
    mutating func interestBy2() {
        self = self * Double.interestRate
    }
    //定义静态方法
    static func interestBy3(amount: Double) -> Double {
        return amount * interestRate
    }
}

扩展构造函数

  1. 值类型扩展构造函数
    值类型构造函数扩展和扩展方法没有区别,实例如下:
struct Rectangle {
    var width: Double
    var height: Double
    init(width: Double, height: Double) {
        self.width = width
        self.height = height
    }
}

extension Rectangle {
    init(length: Double) {
        self.init(width: length, height: length)
    }
}
  1. 引用类型扩展构造函数
    扩展类的时候能向类中添加新的便利构造函数,但是不能添加新的指定构造函数或者是析构函数。指定构造函数和析构函数只能由原始类提供。
    代码示例如下:
class Person {
    var name: String
    var age: Int
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

extension Person {
    convenience init(name: String) {
        self.init(name: name, age: 18)
    }
}

扩展下标

我们可以把下标理解为特殊的属性,可是实现索引访问属性。可以在原始类的基础上拓展下标功能。
下面以扩展字符串通过下标访问字符的功能。

extension String {
    subscript(index: Int) -> String {
        guard (index <= self.characters.count) else {
            return ""
        }
        var c = ""
        var i = 0
        for character in self.characters {
            if i == index {
                c = String(character)
                break
            }
            i += 1
        }
        return c
    }
}

let str = "qwer"
let s = str[3]   // s = r

相关文章

  • Swift 扩展

    扩展UIView 扩展String 扩展UIColor 扩展UIButton 扩展String 扩展UIImage...

  • ES6扩展

    字符串的扩展正则的扩展数值的扩展数组的扩展函数的扩展对象的扩展

  • ES6扩展

    字符串扩展 正则扩展 数值扩展 函数扩展 对象扩展 数组扩展 字符串扩展 模版字符串 部分新的方法 padStar...

  • Swift--扩展

    扩展的概念 扩展计算属性 扩展方法 扩展构造函数 扩展下标 扩展的概念 在Swift中可以使用一种扩展机制,在原有...

  • 从Java到Kotlin(六)

    扩展与委托 目录 1.扩展 1.1 扩展函数 1.2 扩展属性 1.3 扩展伴生对象 1.4 扩展的作用域 2.委...

  • ES6基础-ES6的扩展

    进行对字符串扩展,正则扩展,数值扩展,函数扩展,对象扩展,数组扩展。 开发环境准备: 编辑器(VS Code, A...

  • Vue项目开发与规范--es6语法规范篇

    目录 简介 let const 解构赋值 正则的扩展 字符串的扩展 数值的扩展 数组的扩展 函数的扩展 对象的扩展...

  • Kotlin-面向对象-进阶

    扩展 扩展方法 Kotlin支持扩展方法和扩展属性。语法:被扩展的类/接口名.方法名() 父类不能使用子类的扩展方...

  • 2021-03-14

    请求链接,稍后更新 扩展点简述 扩展点的生命周期及扩展点的执行时机 扩展点的作用 扩展点实战 更多Spring扩展...

  • 2021-03-14-1

    请求链接,稍后更新 扩展点简述 扩展点的生命周期及扩展点的执行时机 扩展点的作用 扩展点实战 更多Spring扩展...

网友评论

      本文标题:扩展

      本文链接:https://www.haomeiwen.com/subject/qmplnxtx.html