写在前头
全文主要分两大块
- 第一块是平时对extension的运用,这个今后会持循更新,遇到好的例子就塞进来
- 第二块则是看文档以后的笔记和心得,而且还有个疑问...
比起心得,我想这个实战练习可能更有意义一些,毕竟你总结了一大堆,结果平日里不用,要不了好久就忘记了,就比如,哥的数学,已经还给老师了,昨天还在一脸沉思状的跑去问同桌,Log n 的默认底数是好多....唉.....
「离散数学」「实用统计」「概率论与数理统计方法」「线性代数」
一想到骆神说程序员要学好上面这几门数学科目,我就感觉整个头都要炸了...
哦对了,还有一本天书,先记下来,怕忘了《具体数学》
好了该找碗鸡汤来喝一下了:
A lot of algorithm textbooks start with a bunch of math. Truth is, the math is useful but most of the time you won't need it. So don't let that scare you. If you can write code, you can also understand all these fancy algorithms and data structures.
Extension实例练习与运用
-
因为在使用一些方法时(如贝塞尔曲线的画线),传参的时候需要的类型是CGPoint,而我们自己创造的某Point类提供的是(Double, Double)(这里你可能会问,为什么不把某Point类的输出改一下就好,那是因为有更多的地方需要(Double, Double)类型,我们自己创造某Point类,也是为了更好的复用,所以,不能因为一个小小的CGPoint,而捡了芝麻丢了西瓜),好了,说回来,我们又不能随便去改某Point类,又不像重复的去做CGPoint的类型转换,那么我们就可以在某Point类的基础上做一个类型扩展(extension). 请看代码:
extension JXPoint { var cgPoint: CGPoint { get { return CGPointMake(CGFloat(x), CGFloat(y)) } } }
我们可以看到,用到了extension关键词,然后在
JXPoint
这个类里面扩展了一个计算属性(Calculatinal Property)cgPoint
-
每次想做一个随机颜色,就需要写一大堆,于是我们就可以基于UIColor做一个扩展(extension)
func randomInt(min: UInt32, _ max: UInt32) -> Int { return Int(arc4random_uniform(max - min +1) + min) } extension UIColor { static func randomColor() -> UIColor { let r = CGFloat(randomInt(0, 255)) / 255.0 let g = CGFloat(randomInt(0, 255)) / 255.0 let b = CGFloat(randomInt(0, 255)) / 255.0 return UIColor(red: r, green: g, blue: b, alpha: 1) } }
上面的randomInt方法是把生成随机数这个过程,单独写成了一个函数,这里不做重点,只需要知道,它会生成一个从min到max之间的随机数.然后下面就是正式对UIColor这个类做了一个扩展,且你会发现randomColor() -> UIColor的方法前面写了一个关键词
static
,这个关键词很重要,这个关键词的意思就是说,生成的方法是一个类方法,而不是针对对象的实例方法,调用该方法的时候使用UIColor这个类来调用,而不是用UIColor.whiteColor类似这样的实例来调用.这样就成功的给UIColor成功扩展了一个随机颜色的类方法.
Extension简介(Introduction)
如果在某个特定场景中,你发现现有的类,缺少了某项功能,那么可以通过类的扩展(extension)的方式现场添加这项功能.
上面是上课做的笔记,但一直有个疑问就是为毛要需要Extension,查看了文档,第二句话,就告诉我们了,上述的特定场景到底是什么场景:
This includes the ability to extend types for which you do not have access to the orighinal source code.
是在我们没有权限去拿到某个类的源代码的情况下,而这个时候我们又觉得这个类缺少一些我想要的功能,那么我们就可以通过类的扩展来临时添加.
但我最初的问题还是没有解决,为毛需要Extension呢? 利用类的继承不可以吗?
Extension的功用
- 增加计算属性(computed property): 实例计算属性与类型计算属性
- 增加方法(Method): 实例方法与类型方法
- 增加新的初始化器(Initializer)
- 定义下标(Subscript)
- 定义与使用新的嵌套类型(Nusted Type)
- 让一个已经存在的类去遵循某个协议(Protocol)
- 扩展协议(Protocol Extension): 除了扩展类还可以扩展协议
Tips: 扩展不能像继承那样去重写(override)"父类"的方法.
Extension语法
extension SomeType: SomeProtocol, AnotherProtocol {
//省略...
}
增加计算属性(Compted Properties)
可以添加计算属性(Computed Property)
不能添加存储属性(Stored Property)与属性检查器(Property observers)
(属性检查器是什么鬼?)
增加初始化器(Initializers)
暂时什么特别的可以说的
增加方法(Methods)
也没啥好说的,文档的例子是给Int做了扩展,这个之前倒是没想到,String,Double,Int等等这种wift基础类也是可以拿来扩展的
其中,增加的实例方法可以改变自己和自己的属性,给Sructure和Enumeration扩展的时候,如果有这种改变自己和自己属性的需求的时候,就直接在方法前加关键词mutating
就可以了. 什么? 你问什么叫改变自己? 来吧~ 看段代码你就懂了,我也刚懂...
extension Int {
mutating func square() {
self = self * self
}
}
var someInt = 3
someInt.squre()
// someInt is now 9
self = self * self
应该是最实在的改变自己了吧~
自己跟自己死磕出了一个新的自己
问题: 我想问的是,给Class呢? 是天生就可以改,还是天生就不能改呢? 隐隐的感觉到,我问的这个问题很蠢...
解答: 刚去做了个实验,Class就是天生可以改变,而且不能加mutating,因为人天生丽质,丫不需要....
增加下标(Subscripts)
貌似什么类型都可以加个下标
extension Int {
subscript(digitIndex: Int) -> Int { /* 省略... */ }
}
这个语法也是莫名奇妙,既不是计算属性的样子(没有
var
),也不是方法的样子(没有func
),看样子除了,记住它,也没啥子办法了
嵌套类型(Nested Types)
也没什么特别的...
扩展协议(Protocol Extension)
这个在协议那章有讲,我看了下,实在看不动....算了,以后再看吧
最后
还是遗留了一个问题,等待今后去发现吧
为什么需要Extension呢? 利用类的继承不可以吗?
查了一下,貌似没人问这个问题,又一次隐隐的感觉自己问了一个弱爆了的问题....