Swift学习之路-关键字解读
文章基于Swift版本:3.0.1
在本篇文章中,主要讲解的是Swift中的一些关键字,让刚接触Swift的同学可以更快的理解Swift代码。
常见的关键字
- let/var:修饰常量或者变量
|
|
- class/struct/enum:修饰类、结构体、枚举
|
|
protocol:修饰协议
123protocol SomeDelegate {}extension:修饰扩展
不太常见的关键字
- deinit
- inout:表示函数的参数可以在内部改变
|
|
- final:表示该类不允许继承,常用于你不想被重写的类。
|
|
throw
try
T
mutating:表示其修饰的值类型可以在实例方法中修改值类型的属性(结构体和枚举是值类型,而它们默认是不能在实例方法中修改它们的属性)。
代码示例(该例子来源[Swift Tips]):
本例子来源官方文档
- where
- $
- associatedtype
- typealias
- open,public,internal,filepart,private
- fileprivate(set),private(set) 或 internal(set)
idea
Swift学习之路-Extension
请在阅读本文章时,顺手将文中的示例代码在playground中敲一遍,这样能加深理解!!!
阅读该文章大约需要:15分钟
读完之后你能获得:
1、Extension是什么
2、它能做什么
本文全部内容基于Swift版本:3.0.1
Extension的基本语法
|
|
Tip:扩展可以为一个类型添加新的功能,但是不能重写已有的功能。
|
|
Swift中的Extension可以做什么
我们想知道Extension在Swift中能做些什么,最直接的方法就是查看Swift的官方文档了。下面是文档中指出Extension能做的六个方面。
- 添加计算型实例属性和计算型类型属性
- 定义实例方法和类型方法
- 提供新的构造器
- 定义下标
- 定义和使用新的嵌套类型
- 使已存在的类型遵守某个协议
看完上面Extension能做的六个方面,我们来逐条解释说明一下:
添加计算型实例属性和计算型类型属性
首先我们要了解什么是计算型属性,计算型属性(computed property)不直接存储值,而是提供一个getter
和一个可选的setter
,来间接获取和设置其他属性或变量的值。关于更多的计算型属性的内容请自行查看官方文档,在此不再赘述。那么我们什么场景可以用到这个功能呢?举一个最常见的例子,当你想访问某个view的width的时候,通常情况下你会这么写:
|
|
但是这样写很长很不方便,作为一个懒惰的程序员,这时候你就要想我能不能缩短访问该属性的代码。不要犹豫了骚年,这时候你只需要写一个UIView的Extension就可以达到你的目的。
|
|
这样你就可以通过来访问该属性。怎么样,有没有感受到Extension的便利之处。
|
|
定义实例方法和类型方法
在你辛辛苦苦写完一个Student类后,万恶的产品过来告诉你需求改了,这时虽然你心中有一万只草泥马在奔腾,但是为了心中那份神圣的程序员的责任感(当然还有糊口的工资),你还是要修改代码。如果你想在不改变原始类的基础上添加功能,那你可以给Student类添加Extension来解决问题。
Tip:这里值得注意的一点是在Swift中,Extension可以给类和类型添加,比如你也可以给一个struct添加Extension,而在Objective-C中,你只能给类添加Extension。
|
|
提供新的构造器(Initializers)
最常见的Rect通常由origin
和size
来构造初始化,但是如果在你写完Rect的定义后,你偏偏想要通过center和size来确定Rect(作为一个程序员就要有一种作死的精神),那你就要用Extension来给Rect提供一个新的构造器。关于更多关于构造器的信息,请参考官方文档
本例子来源官方文档
|
|
通过Extension来给Rect添加一个新的构造器。
|
|
这样你就可以通过新的构造器来初始化Rect。
|
|
定义下标
通过Swift中的Extension,你可以给已知类型添加下标。例如下面的例子就是给Int
类型添加一个下标,该下标表示十进制数从右向左的第n个数字。
本例子来源官方文档
|
|
定义和使用新的嵌套类型(nest type)
Extensions可以给已知的类、结构体、枚举添加嵌套类型。下面的例子是给Int类型添加一个判断正负数的Extension,该Extension嵌套一个枚举。
本例子来源官方文档
|
|
使已存在的类型遵守某个协议
编写使该类型遵守某个协议的Extension的语法如下:
|
|
示例代码:
|
|
若添加Extension的类型已经实现协议中的内容,你可以写一个空的Extension来遵守协议:
|
|
总结
- Extension可以为一个已有的类、结构体、枚举类型或者协议类型添加新功能。
- 可以在没有权限获取原始源代码的情况下扩展类型的内容
- Extendion和Objective-C中的Category类似。(OC中的Category有名字,Swift中的扩展没有名字)
下篇预告:Swift-Protocol
若本文有何错误或者不当之处,还望不吝赐教。谢谢!
iOS知识点
Xcode
快捷键
- Command+Shift+O:快速打开文件
- Command + Shift + J:显示左侧导航栏
- Control + 6:快捷查找方法
- 快速查看谁写的代码:选中一行代码右键,选择
Show Blame for Line
项目规范
- 属性命名规范
|
|
- 在逻辑表达中不要使用纯数字
eg:
|
|
如果你这样使用的话,在等你隔一段时间或者别人改你的代码的时候还要重新闾一遍逻辑,来看一下这个3
到底代表什么。如果你在取得为某个product的的字典,而product所在cell上面还有三个别的cell,你可以将3
改为cellNumberTopOfProduct
。这样的话别人就会知道该变量代表的product上面还有几个cell,而不是在去理解3
。
小知识点
- 在使用UINavigationController的pushViewController:animated:执行入栈一个子控制器操作时,如果自控制器背景色没有设置则会出现”卡顿”现象。
原因:这是因为从iOS7开始,UIViewController的根view的背景颜色默认为透明色即clearColor,所谓”卡顿”其实就是由于透明色重叠后,造成视觉上的错觉,所以这并不是真正的”卡顿”。
iOS 中Unicode和中文字符的二三事
2017年的目标
- 读完十二本书
- 体重减20斤
- 英语达到看英文文档无压力,能简单的口语
Swift-Range
Swift 的range比NSRange更加复杂,并且它在Swift3中并没有变的更加容易。如果你想更加透彻的明白复杂的原因,你可以阅读这还有这。我仅仅告诉你如何创建和使用它们。
Closed Ranges: a...b
这个区间表达式创建了一个Swift的range,该表达式包含元素a和元素b,即使可能为某个类型的最大值(例如Int.max
)。关于closed range有两个类型:CloseRange
和CountableCloseRange
。
ClosedRange
该区间的所有元素是可比较的在Swift中(它们遵守Comparable
协议)。
它会允许你访问一个集合中某区间的元素。代码示例:
|
|
但是,ClosedRange
是不可计算的(它没有遵守Sequence
协议)。这就意味你不能迭代该区间的值通过一个循环,如果你想循环访问某个区间的值你需要使用CountableClosedRange
类型。
CountableClosedRange
该类型可迭代循环。
|
|
Half-Open Range:a..<b
该区间表达式包含a但不包括b,和上面一样,它也有两个不同的类型:Range
和CountableRange
Range
和CloseRange
一样,你可以在一个集合中访问某区间的元素,示例代码:
|
|
重要的事再说一次,该类型不可应用于for循环语句!
CountableRange
该类型可应用于for循环语句
|
|
NSRange
有的时候你仍然需要使用NSRange在Swift(eg:当你创建富文本的时候),所以了解如何创建它也是非常有用的。
|
|
在这里强调一下上面的表达式代表的是location
和length
,并不是start index
和end index
。上面的例子和Swift中3..<5
看起来非常相似。但是,它俩是不同的,它们并不能互相替换使用。
Ranges with Strings
通过...
和..<
创建ranges是非常方便的方法。代码示例:
|
|
比较苦逼的创建方式(作用和上面的代码是一样的):
|
|
Problem with NSRange
NSRange在截取含有emoji字符的字符串时,会出现错误。
代码示例:
|
|
Swift Solution
由于以上的原因,在Swift中的字符串你需要使用Range<String.Index>
而不是Range<Int>
。String Index的计算是基于一个特殊的string,所以它能识别string中含有emoji或者其他的扩展字体集。
代码示例:
|
|