swift_027(Swift 的扩展)
//***********swift学习之27--扩展--***************************
/*
扩展跟OC一样就是向一个已有的类、结构体或枚举类型添加新功能。
只能添加新的功能,不能重写已有的功能。
*/
// 扩展声明使用关键字 extension:
// 一个扩展可以扩展一个已有类型,使其能够适配一个或多个协议,语法格式如下:
// extension SomeType: SomeProtocol, AnotherProctocol {
// 协议实现写到这里
// }
// Swift 中的扩展可以:
// 1.添加计算型属性和计算型静态属性
// 2.定义实例方法和类型方法
// 3.提供新的构造器
// 4.定义下标
// 5.定义和使用新的嵌套类型
// 6.使一个已有类型符合某个协议
// 1.添加计算型属性
// 下面的例子向 Int 类型添加了 4 个计算型实例属性并扩展其功能:
extension Int {
var add: Int {return self + 100 }
var sub: Int { return self - 10 }
var mul: Int { return self * 10 }
var div: Int { return self / 5 }
}
let addition = 3.add
print("加法运算后的值:\(addition)")
let subtraction = 120.sub
print("减法运算后的值:\(subtraction)")
let multiplication = 39.mul
print("乘法运算后的值:\(multiplication)")
let division = 55.div
print("除法运算后的值: \(division)")
let mix = 30.add + 34.sub
print("混合运算结果:\(mix)")
// 2方法
// 扩展可以向已有类型添加新的实例方法和类型方法。
// 下面的例子向Int类型添加一个名为 topics 的新实例方法:
extension Int {
func topics(summation: () -> ()) {
for _ in 0..<self {
summation()
}
}
}
4.topics(summation: {
print("扩展模块内")
})
3.topics(summation: {
print("内型转换模块内")
})
// 2.可变实例方法
/*
通过扩展添加的实例方法也可以修改该实例本身。
结构体和枚举类型中修改self或其属性的方法必须将该实例方法标注为mutating,正如来自原始实现的修改方法一样。
实例
下面的例子向 Swift 的 Double 类型添加了一个新的名为 square 的修改方法,来实现一个原始值的平方计算:
*/
extension Double {
mutating func square() {
let pi = 3.1415
self = pi * self * self
}
}
var Trial1 = 10.0
Trial1.square()
print("圆的面积为: \(Trial1)")
var Trial2 = 1.0
Trial2.square()
print("圆的面积为: \(Trial2)")
var Trial3 = 2.0
Trial3.square()
print("圆的面积为: \(Trial3)")
// 3.构造器
// 扩展可以向已有类型添加新的构造器。
// 这可以让你扩展其它类型,将你自己的定制类型作为构造器参数,或者提供该类型的原始实现中没有包含的额外初始化选项。
// 扩展可以向类中添加新的--便利构造器 init()--,但不能向类中添加新的指定构造器或析构函数 deinit() 。
struct sum {
var num1 = 100, num2 = 200
}
struct diff {
var no1 = 200, no2 = 100
}
struct mult {
var a = sum()
var b = diff()
}
let calc = mult()
print ("mult 模块内 \(calc.a.num1, calc.a.num2)")
print("mult 模块内 \(calc.b.no1, calc.b.no2)")
let memcalc = mult(a: sum(num1: 300, num2: 500),b: diff(no1: 300, no2: 100))
print("mult 模块内 \(memcalc.a.num1, memcalc.a.num2)")
print("mult 模块内 \(memcalc.b.no1, memcalc.b.no2)")
extension mult {
// 有时候我们并不关心区间内每一项的值,能够使用下划线来忽略这些值。
init(x: sum, y: diff) {
_ = x.num1 + x.num2
_ = y.no1 + y.no2
}
}
let a = sum(num1: 100, num2: 200)
print("Sum 模块内:\( a.num1, a.num2)")
let b = diff(no1: 200, no2: 100)
print("Diff 模块内: \(b.no1, b.no2)")
let calcee = mult(x:a,y:b)
// 4.下标
// 扩展可以向一个已有类型添加新下标。
// 以下例子向 Swift 内建类型Int添加了一个整型下标。该下标[n]返回十进制数字
extension Int {
subscript( multtable: Int) -> Int {
var multtable = multtable
var no1 = 1
while multtable > 0 {
no1 *= 10
multtable -= 1
}
return (self / no1) % 10
}
}
print("4.下标---\(12[0])")
print("4.下标---\(7869[1])")
print("4.下标---\(786543[2])")
// 5.嵌套类型
// 扩展可以向已有的类、结构体和枚举添加新的嵌套类型:
extension Int {
//扩展了一个枚举
enum calc
{
case add
case sub
case mult
case div
case anything
}
// 扩展了一个闭包
var printCase: calc {
switch self
{
case 0:
return .add
case 1:
return .sub
case 2:
return .mult
case 3:
return .div
default:
return .anything
}
}
}
func result(numb: [Int]) {
for i in numb {
switch i.printCase {
case .add:
print(" 10 ")
case .sub:
print(" 20 ")
case .mult:
print(" 30 ")
case .div:
print(" 40 ")
default:
print(" 50 ")
}
}
}
result(numb: [0, 1, 2, 3, 4, 7])
swift_027(Swift 的扩展)相关推荐
- Swift extension 扩展实用Tips
extension基本功能 Swift扩展是为结构体.类和枚举增加新功能.与OC的分类相似,但是没有扩展名字. 常用于: 添加类/实例计算属性 添加类/实例方法 提供新便携初始化器 定义和使用新内嵌类 ...
- Swift类扩展使用方法
2019独角兽企业重金招聘Python工程师标准>>> Swift是没有OC中的分类的. 但可以进行类扩展, 一般用于实现代理方法. 类扩展中无法定义属性 使用方法: extensi ...
- 6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器...
1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明 ...
- Swift之扩展的使用和实例展示
一.什么是扩展? 扩展就是向一个已有的类.结构体或枚举类型添加新功能,扩展可以对一个类型添加新的功能,但是不能重写已有的功能. Swift 中的扩展可以: 添加计算型属性和计算型静态属性: 定义实例方 ...
- Swift中文教程(二十) 扩展
扩展就是向一个已有的类.结构体或枚举类型添加新功能(functionality).这包括在没有权限获取原始源代码的情况下扩展类型的能力(即逆向建模).扩展和 Objective-C 中的分类(cate ...
- swift扩展_Swift扩展
swift扩展 Continuing with our series of Swift tutorials, we'll be discussing and playing around with S ...
- Swift vs. Kotlin 漫谈之扩展篇
Swift vs. Kotlin 漫谈之扩展篇 转载自公众号 KotlinThree 里的一篇文章:https://mp.weixin.qq.com/s?__biz=MzU3MDA3NzMzOA==& ...
- swift 扩展_24个用于更清洁代码的Swift扩展
swift 扩展 One of the best features of both Swift and Objective-C, in my opinion, is extensions. They ...
- Swift learning part 20 - 扩展
文章目录 扩展的语法 计算型属性 构造器 方法 可变实例方法 下标 嵌套类型 扩展可以为一个已有的类.结构体.枚举或者协议添加新功能.它还具有在不访问被扩展类型的原始源代码的情况下完成扩展的能力(即 ...
最新文章
- java.lang类在电脑哪个位置_Java中的java.lang.Class API 详解
- 自定义对话框JDialog的使用实例
- 洛谷P1083 [NOIP2012提高组Day2T2]借教室
- html元素分类以及嵌套规则
- vs2010本地调试打不开网页
- php行内块,块级元素和行内块元素是什么?
- mysql sql语句书写之面试部分
- Abraca:XMMS2 的客户端
- javascript设计模式_JavaScript 设计模式 学习总结
- 13. JavaScript 字符串(String)对象
- 紫书刷题记录UVa10935 卡片游戏
- zblog include html页面,zblog模板开发第一课:zblog标签调用大全
- 解决VMware虚拟机中鼠标闪烁问题
- 教你如何用cmd命令清除流氓软件
- ​华海诚科在科创板注册生效:预计年收入超3亿元,深圳哈勃为股东​
- 全面解析Mybatis中参数处理
- VMD/NAMD命令/规则
- RSA算法和DH算法的区别
- 解决 Vmware 虚拟机安装linux系统无法联网的的问题
- 元模型驱动架构(M-MDA)思想及应用
热门文章
- Spark PruneDependency 依赖关系 RangePartitioner
- 话说文件系统——aufs源码分析(三)【转】
- TensorFlow 1.0 正式发布 你需要知道的都在这里
- ubuntu 16.04 更新后搜狗输入法无法输入中文的问题
- Windows下Nginx+Tomcat整合的安装与配置
- 菜鸟学Java(十九)——WEB项目测试好帮手,Maven+Jetty
- Lync Server 2010迁移至Lync Server 2013部署系列21:Lync 2013边缘第二台服务器配置
- crypt错误分析和解决
- XPath-Helper 的安装和使用
- CCNA 之 三 TCP/IP 及 子网划分