一、Swift扩展

扩展就是向一个已有的类、结构体或枚举类型添加新功能,这包括在没有权限获取原始源代码的情况下扩展类型的能力。
扩展和 Objective-C中的分类(category)类似,但是它要比分类强大的多,它不仅可以扩展类,还可以扩展协议、枚举、结构体,另外扩展也不局限于扩展方法,还可以扩展便利构造方法、计算属性、下标脚本等

Swift中的扩展可以:
  1. 添加计算属性和计算静态属性
  2. 添加实例方法和类型方法
  3. 提供新的构造器
  4. 添加下标脚本
  5. 定义和使用新的嵌套类型
//使用扩展需要使用到extension关键字,这里的SomeType可以是类、结构体、枚举、协议等类型
extension SomeType{
//添加到SomeType的新功能写在这里
}
//一个扩展可以扩展一个已有类型,使其能够适配一个或多个协议
extension SomeType: SomeProtocol, AnotherProctocol {
// 协议实现写到这里
}
1. 扩展属性(只能是计算属性)
//扩展系统结构体Double,添加计算属性
extension Double {
var km: Double { return self * 1_000.0 } //计算只读属性的简化写法
var m : Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
var ft: Double { return self / 3.28084 }
}
var inch:Double = 25.4
let oneInch = inch.mm
print("One inch is \(oneInch) meters")
// 打印输出:One inch is 0.0254 meters
var feet:Double = 3.0
let threeFeet = feet.ft
print("Three feet is \(threeFeet) meters")
// 打印输出:Three feet is 0.914399970739201 meters

注意:
扩展可以添加新的计算属性,但是不可以添加存储属性,也不可以向已有属性添加属性观测器。

2. 扩展实例方法和类型方法
//向Int类型添加一个名为repetitions的新实例方法,接受一个空参数无返回值的函数类型参数
extension Int {
func repetitions(task: () -> ()) {
//重复执行本身值次数的函数
for _ in 0..<self {
task()
}
}
//扩展类型方法
static func number()->[Int]{
return [1, 2, 3]
}
}
var value:Int = 3
value.repetitions({
print("Hello World")
})
/* 打印:
Hello World
Hello World
Hello World
*/
value.repetitions{//尾闭包简化
print("extension")
}
/* 打印:
extension
extension
extension
*/
print(Int.number())//打印:[1, 2, 3]
3. 扩展构造器
//定义一个类
class Person {
var firstName:String
var lastName:String
var age:Int = 0
var fullName:String{
get{
return firstName + " " + lastName
}
}
init(firstName:String, lastName:String){
self.firstName = firstName
self.lastName = lastName
}
}
//扩展该类,扩展便利构造器方法
extension Person{
//类类型只能扩展便利构造方法,不能扩展指定构造方法
convenience init(){
self.init(firstName:"", lastName:"")
}
}
var p = Person()
p.firstName = "Liu"
p.lastName = "Ting"
p.age = 22
print(p.fullName) //打印:Liu Ting
/* 扩展结构体 */
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
}
//默认构造器方法
let defaultRect = Rect()
//成员逐一构造器方法
let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0),
size: Size(width: 5.0, height: 5.0))
//扩展结构体
extension Rect {
//这个新的构造器会根据提供的center和size值计算一个合适的原点。
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
//调用成员逐一构造器
self.init(origin: Point(x: originX, y: originY),
size: size)
}
}
let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
size: Size(width: 3.0, height: 3.0))
// centerRect的原点是 (2.5, 2.5),大小是 (3.0, 3.0)
  1. 类类型只能扩展便利构造方法,不能扩展指定构造方法
  2. 值类型扩展指定构造方法访问默认构造方法和成员逐一构造器的条件是:
  • 保证存储属性都有值(一般需要调用默认构造方法或成员逐一构造方法)
  • 在源类型中没有定义该指定构造器方法
4. 扩展下标脚本
//为系统类型Int添加扩展
extension Int {
//扩展下标脚本,获取对应下标位数的数字
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}
var value:Int = 1234567
print(value[0]) //结果:7
print(value[1]) //结果:6
print(value[2]) //结果:5
print(value[3]) //结果:4
5. 扩展嵌套类型
//为系统类型Character添加扩展
extension Character {
//扩展嵌套类型,表示元音、辅音、其他
enum Kind {
case Vowel, Consonant, Other
}
//扩展计算属性
var kind: Kind {
//转为小写后进行元辅音匹配
switch String(self).lowercaseString {
case "a", "e", "i", "o", "u":
return .Vowel
case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
"n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
return .Consonant
default:
return .Other
}
}
}
var word = "Hello"
//遍历字符串的所有字符
for character in word.characters {
switch character.kind {
case .Vowel: //因为kind属性指定了类型,是Character.Kind.Vowel的简化
print("\(character)是元音")
case .Consonant:
print("\(character)是辅音")
case .Other:
print("\(character)是其他")
}
}
/* 打印:
H是辅音
e是元音
l是辅音
l是辅音
o是元音
*/

灵活使用Swift的扩展,可以提高我们的编码效率,就像我们在OC中积累项目经验,有一些东西会已分类的形式进行积累,可以方便我们移植到其他项目中,提高我们的效率,Swift扩展就是比这个更加强大的存在,没理由不用

iOS学习笔记46-Swift(六)扩展的更多相关文章

  1. iOS学习笔记(十六)——数据库操作(使用FMDB)

    iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepers ...

  2. [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading

    上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...

  3. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  4. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  5. Nodejs学习笔记(十六)--- Pomelo介绍&入门

    目录 前言&介绍 安装Pomelo 创建项目并启动 创建项目 项目结构说明 启动 测试连接 聊天服务器 新建gate和chat服务器 配置master.json 配置servers.json ...

  6. Nodejs学习笔记(十六)—Pomelo介绍&入门

    前言&介绍 Pomelo:一个快速.可扩展.Node.js分布式游戏服务器框架 从三四年前接触Node.js开始就接触到了Pomelo,从Pomelo最初的版本到现在,总的来说网易出品还算不错 ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第六章:在Direct3D中绘制

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第六章:在Direct3D中绘制 代码工程地址: https://gi ...

  8. iOS学习笔记之Category

    iOS学习笔记之Category 写在前面 Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法.使用类别可以对框架提供的类(无法获取源码,不能直接修改) ...

  9. iOS学习笔记06—Category和Extension

    iOS学习笔记06—Category和Extension 一.概述 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inher ...

  10. IOS学习笔记48--一些常见的IOS知识点+面试题

      IOS学习笔记48--一些常见的IOS知识点+面试题   1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...

随机推荐

  1. Cesium左右立体视觉续篇——遗留问题(渲染错误)以及临时替代方案

    遗留问题详细说明 已解决部分 立体视觉中的视差: 横向渲染压缩. 遗留问题 1.左右分屏中的部分地图切片未渲染 问题描述:如下图(图片为解决问题后的图片),红色区域会显示黑色,无法正常显示影像.2.相 ...

  2. UVA11019 Matrix Matcher (AC自动机)

    二维的矩阵匹配,把模式矩阵按列拆开构造AC自动机,记录行号(为了缩点判断). 把T矩阵按行匹配,一旦匹配成功,在假想的子矩阵左上角位置加一.最后统计总数. 因为所有模式串长度一样,不用维护last数组 ...

  3. cv2.Laplacian 模糊判断

    简介   cv2.Laplacian是用来判断图像模糊度的     函数原型 dst = cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta ...

  4. XPath语法规则及实例

    XPath语法规则及实例 XPath语法规则 一.XPath术语: 1.节点:在XPath中,有七种类型的节点:元素.属性.文本.命名空间.处理指令.注释以及文档(根)节点. XML文档是被作为节点树 ...

  5. (原)IPhone开发时把ToolBar中的元素居中的技巧

    在IPhone应用开发时,经常用到ToolBar,其中的控件通常都是居左,想让它居中就有点困难. 这里介绍一种方法: 将Flexible Space Bar Button Item从库中拖到位于控件左 ...

  6. xshell5 上传下载命令

    借助XShell,使用linux命令sz可以很方便的将服务器上的文件下载到本地,使用rz命令则是把本地文件上传到服务器. yum -y install lrzsz 其中,对于sz和rz的理解与记忆我用 ...

  7. 怎样将Oracle数据库设置为归档模式及非归档模式

    怎样将Oracle数据库设置为归档模式及非归档模式 1.Oracle日志分类 分三大类: Alert log files--警报日志,Trace files--跟踪日志(用户和进程)和 redo lo ...

  8. Java开发小游戏 用键盘控制精灵在游戏中上下左右跑动 窗体小游戏可打包下载,解压后双击start运行

    package com.swift; import java.awt.Point; import java.awt.event.KeyEvent; import com.rupeng.game.Gam ...

  9. 使用xcode 8 调试ios10

    这几天更新了ios10,发现真机不能调试,弹出几个错,表示没有证书.用ios9的真机能调试, 真他么坑,总结一下解决方法. 在BuildSetting 的Signing中Code Signing Id ...

  10. javascript设计模式(张容铭)学习笔记 - 外观模式绑定事件

    有一个需求要为document对象绑定click事件来是想隐藏提示框的交互功能,于是小白写了如下代码: document.onclick = function(e) { e.preventDefaul ...