扩展

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

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

声明扩展

扩展语法:

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容