Swift学习笔试19——扩展(Extension)
2015-10-07 19:27
627 查看
Swift中的扩展就是OC中的分类。但是这里的扩展可以对类、结构体、枚举类进行添加。使用扩展,我们可以在不接触源代码的前提下,对已有的代码进行功能上的添加。
Swift中的扩展提供的一些功能:
1、添加计算属性或类计算属性,但是不能添加存储属性。
2、添加实例方法或类别方法。但是不能覆盖已经存在的方法。
3、定义新的构造器。
4、定义和使用新的嵌套类。
5、令已经存在的类型遵守协议。
假设我们已经有了一个Animal类,但是不能得到它的源代码。
上面代码需要注意的是扩展构造器的时候,在构造器的时候讲过,在扩展中添加构造器是不会影响默认构造器的产生。不能添加原来已有的构造器。
另外在类扩展里面,是不给添加指定构造器或析构器,只能添加便利构造器。在便利构造器中,要先调用原来的构造器来初始化类后,才能对类进行访问。
扩展还有一个作用就是让类遵守协议。这部分留到协议里面讲。
下面将以前将过的麻烦的String类型做一个扩展,使得方便截串和获取长度。
然后就可以这样截串
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")
相关文章推荐
- Swift中的可选类型Optional与if let 语法
- 11.Swift XML解析
- swift开发的那些应用
- 10.Swift 数据存取
- Swift中Singleton的实现
- 基于iOS开发对Swift构造方法的感悟
- Swift中的构造方法
- Swift详解之NSPredicate
- Swift学习笔记20——协议(Protocols)
- 【Swift】学习笔记(一)——熟知 基础数据类型,编码风格,元组,主张
- Swift与OC代码转换实例
- swift中的as?和as!
- Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)
- Swift - 给图片添加滤镜效果(棕褐色老照片滤镜,黑白滤镜)
- Swift - .plist文件数据的读取和存储
- Swift - 使用HTML5进行iOS开发(将HTML5打包成iOS应用)
- Swift - 禁用UIWebView和WKWebView的下拉拖动效果
- Swift - 异步加载各网站的favicon图标,并在单元格中显示
- Swift - 使用闭包筛选过滤数据元素
- Swift - 使用UI Dynamics给UIKit组件添加移动吸附行为