您的位置:首页 > 移动开发 > Swift

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

2015-10-07 19:27 627 查看
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")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: