Swift学习笔试19——扩展(Extension)

Swift中的扩展就是OC中的分类。但是这里的扩展可以对类、结构体、枚举类进行添加。使用扩展,我们可以在不接触源代码的前提下,对已有的代码进行功能上的添加。

Swift中的扩展提供的一些功能:

1、添加计算属性或类计算属性,但是不能添加存储属性。

2、添加实例方法或类别方法。但是不能覆盖已经存在的方法。

3、定义新的构造器。

4、定义和使用新的嵌套类。

5、令已经存在的类型遵守协议。


假设我们已经有了一个Animal类,但是不能得到它的源代码。

class Animal {
    var life: Int = 0
    var height: Double = 0
}
我们利用扩展,对Animal添加一个计算属性和方法、构造器还有嵌套类。 当然也可以添加下标,但这里不演示了。

extension Animal {
    //扩展计算属性
    var lifeYear : Double { return Double(self.life) / 365 }
    //扩展构造器
    convenience init(life: Int, height: Double) {
        self.init()
        self.life = life
        self.height = height
    }
    //扩展方法
    func makeSound() -> String {
        return "I can live \(lifeYear) years"
    }
    // 扩展嵌套类
    enum Size {
        case Big, Small, SuperSmall
    }
    // 扩展一个使用嵌套类的计算属性
    var size: Size {
        switch height {
        case let h where h > 10:
            return .Big
        case let h where h > 0.1:
            return .Small
        default:
            return .SuperSmall
        }
    }
}

var a = Animal(life: 365 * 7, height: 0.001)
print(a.size)   // SuperSmall
print(a.lifeYear)   // 7.0
print(a.makeSound())   // I can live 7.0 years

上面代码需要注意的是扩展构造器的时候,在构造器的时候讲过,在扩展中添加构造器是不会影响默认构造器的产生。不能添加原来已有的构造器。

另外在类扩展里面,是不给添加指定构造器或析构器,只能添加便利构造器。在便利构造器中,要先调用原来的构造器来初始化类后,才能对类进行访问。


扩展还有一个作用就是让类遵守协议。这部分留到协议里面讲。


下面将以前将过的麻烦的String类型做一个扩展,使得方便截串和获取长度。

extension String {
    //获取字符串长度
    var length: Int { return self.characters.count }
    
    //获取部分字符串,如果不在范围内,返回nil。如果end大于字符串长度,那么截取到最后
    subscript (start: Int, end: Int) -> String? {
        if start > self.length || start < 0 || start > end {
            return nil
        }
        let begin = self.startIndex.advancedBy(start)
        var terminal: Index
        if end >= length {
            terminal = self.startIndex.advancedBy(length)
        } else {
            terminal = self.startIndex.advancedBy(end + 1)
        }
        let range = Range(start: begin, end: terminal)
        return self.substringWithRange(range)
    }
    //获取某个字符,如果不在范围内,返回nil
    subscript (index: Int) -> Character? {
        if index > self.length - 1 || index < 0 {
            return nil
        }
        return self[self.startIndex.advancedBy(index)]
    }
}

然后就可以这样截串

var s = "哈0123456789"
print(s.length) // 11
print(s[0,2])    // Optional("哈01")
print(s[9])     // Optional("8")


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值