Swift|Swift 学习 - 关键词

前言 学习 Swift 已经有一段时间了。但是由于是看完语法直接上手的那种,所以对于基本的东西都不是很了解。今天来学习一下 Swift 的关键字。
在Swift官方文档的词汇结构中, 有非常多的关键字, 它们被用于声明中、语句中、表达式中、类中、模式中, 还有以数字符号#开头的关键字, 以及特定上下文环境使用的关键字。
关键字统计 用在声明中的关键字 associatedtype、class、deinit、enum、extension、func、import、init、inout、internal、let、operator、private、protocol、public、open、fileprivate、static、struct、subscript、typealias 和 var。
用在语句中的关键字 break、case、continue、default、defer、do、else、fallthrough、for、guard、if、in、repeat、return、switch、where 和 while 。
用在表达式和类型中的关键字 as、catch、dynamicType、false、is、nil , rethrows、super、self、Self、throw、throws、true 和 try 。
特定上下文中被保留的关键字 associativity、convenience、dynamic、didSet、final、get、infix、indirect、lazy、left、mutating、none、nonmutating、optional、override、postfix、precedence、prefix、Protocol、required、right、set、Type、unowned、weak 和 willSet 。
起始于数字标记(#)的关键字 #available#column#else#elseif#endif#file#function#if#line#selector#sourceLocation
特性中的关键字(@) @available、@discardableResult、@GKInspectable、@nonobjc、@objc、@NSCopying、@NSManaged、@objcMembers、@testable、@NSApplicationMain、@UIApplicationMain、@IBAction、@IBOutlet、@IBDesignable、@IBInspectable、@autoclosure、@escaping、@convention。
关键字简单解释和运用 用在声明中的关键字 associatedtype 【Swift|Swift 学习 - 关键词】定义一个协议时,有时在协议定义里声明一个或多个关联类型是很有用的。关联类型给协议中用到的类型一个占位符名称。直到采纳协议时,才指定用于该关联类型的实际类型。关联类型通过 associatedtype 关键字指定。
这里是一个叫做Container 的示例协议,声明了一个叫做 ItemType 的关联类型:

protocol Container { associatedtype ItemType mutating func append(_ item: ItemType) var count: Int { get } } struct IntStack: Container { // original IntStack implementation var items = [Int]()// conformance to the Container protocol typealias ItemType = Int mutating func append(_ item: Int) { // append... } var count: Int { return items.count } }

上述代码中,先通过associatedtype ItemType定义占位符,等到使用的时候再通过typealias ItemType = Int确定占位符具体类型。
typealias 协议组合类型允许你指定一个值,该值的类型遵循多个协议的要求而不必显式定义一个新的命名型的继承自每个你想要该类型遵循的协议的协议。比如,指定一个协议组合类型 ProtocolA & ProtocolB & ProtocolC实际上是和定义一个新的继承自 ProtocolA,ProtocolB, ProtocolC的协议 ProtocolD是完全一样的,但不需要引入一个新名字同理,标明一个协议组合类型 SuperClass & ProtocolA与声明一个新类型 SubClass继承自 SuperClass 并遵循 ProtocolA是一样的,但不需要引入新名字。
协议组合列表中的每项元素必须是类名,协议名或协议组合类型、协议、类的类型别名。列表可以最多包含一个类。
当协议组合类型包含类型别名,就有可能同一个协议在定义中出现不止一次——重复会被忽略。比如说,下面的 PQR 定义等价于 P & Q & R :
typealias PQ = P & Q typealias PQR = PQ & Q & R

class 创建类的关键词,和其他语言一样。是引用类型,和 Struct 对应。
struct 创建结构体的关键词,和其他语言一样,但是 Swift 中它的重要性比其他语言要强的多。是值类型,和 Class 对应。
protocol 定义协议的关键词
init 构造方法,类、结构题初始化的时候调用的方法。
deinit 析构方法,类、结构体释放的时候调用的方法,和 init 对应。
enum 定义枚举类型的关键词。
extension 扩展,可以用于扩展 Class、Struct、Protocol等,是非常常用的一个功能。
func 方法定义关键词。
import 导入其他模块关键词。
inout 一般用于方法的形参,可以使在方法体内修改形参的值同步到方法体外的变量上。
let 定义变量时使用,只能赋值一次,和 var 对应 。
var 定义变量时使用,定义可以多次修改值,和 let 对应。
operator 用于自定义操作,需要和 prefix、postfix、infix 配合使用。
open 访问权限修饰符,任何地方都可以访问,并且可以继承和重写。
public 访问权限修饰符,任何地方都可以访问,模块外部不能继承和重写,模块内部可以继承和重写。
internal 访问权限修饰符,默认访问级别,可以在整个模块中访问, 外部不可以访问。
fileprivate 访问权限修饰符,只能在当前源文件中访问。
private 访问权限修饰符,修饰方法、属性时,只能在当前类中访问;修饰类,结构体时,只能在当前源文件中访问。
static 静态修饰符,和其他语言一致。
subscript 下标语法。类,结构和枚举可以定义下标,它们是访问集合,列表或序列的成员元素的快捷方式。 您可以使用下标来按索引设置和检索值,而不需要单独的设置和检索方法。
用在语句中的关键字 switch 分支选择关键词,和其他语言一样。
case 条件分支关键词,和其他语言一样。
fallthrough 一般用于 switch 中,表示执行下一个 case 语句
default 默认分支关键词,和其他语言一样。
在 Swift 中,switch 语句和其他语言不同的地方在于不需要显性使用 break 关键词。如果想要继续执行下一条 case,则需要添加新的关键词 fallthrough
break 用于跳出当前控制语句。
continue 用于跳出本次循环,执行下一次循环的条件判断。
return 用于结束方法并返回。
defer 用于表示在当前代码块最后执行,如果在一个代码块中有多个,则最先定义的最后执行。
do 不知道怎么解释,以后在补充。
guard 条件判断,和 if 类似,但是这个必须使用 else 结束当前方法
if 条件判断,和其他语言一样。
else 条件判断,和其他语言一样。
for 循环语句,和其他语言一样
in repeat 和 while 配合使用,和其他语言中的do-while语句一样。
where 额外条件语句,用于设置约束条件,限制类型等。
while 循环语句,通过条件判断来决定是否进入代码块,和其他语言一样。
用在表达式和类型中的关键字 as 用于把一个对象类型转换成指定类型,如果不可以转换则返回 nil。
catch 用于捕获异常。
dynamicType 已经废弃了,被 type(of:) 取代。
false 条件判断中的假。
is 用于判断一个对象是否为某种类型。
nil 空对象。
super 指向父类的关键词。
self 代指当前对象。
Self 用于协议中限制相关类型,用于类中充当方法返回值类型。
throw 调用异常抛出代码。
throws 用于抛出方法的错误和转发错误。
rethrows 用于转发错误,方法本身的错误不会抛出。
try 异常捕获关键词。
特定上下文中被保留的关键字 associativity 指明同一优先级的运算符,在缺少大括号的情况,按什么顺序结合。使用 left、right、none。
convenience 次等的便利构造器,最后会调用指定构造器初始化实例。
dynamic 指明编译器不会对类成员或者函数的方法进行内联或虚拟化。会使用OC的运行时进行动态派发。
final 在任何地方都不能重写
infix 指明一个用于两个值之间的运算符。如果一个全新的全局运算符被定义为 infix,还需要指定优先级。
indirect 指明在枚举类型中,存在成员使用相同枚举类型的实例作为关联值的情况。
lazy 懒加载,在使用的时候再初始化。
left 指明同一优先级的运算符执行顺序是从左到右。
mutating 写在 func 前面使 func 可以修改 Struct 和 Protocol 的 extension 中的成员的值
none 是一个没有结合性的运算符。不允许这样的运算符相邻出现。
nonmutating 指明成员的 setter 方法不会修改实例的值,但可能会有其它后果。
optional 用于指明协议中的可选方法。遵守该协议的实体类可以不实现这个方法。
override 重写父类方法
postfix 位于值后面的运算符。
precedence 运算的优先级,越高的话优先进行计算
prefix 位于值前面的运算符。
Protocol 定义了一组方法、属性或其它要求,用于满足特定任务和一系列功能。
required 确保编译器会检查该类的所有子类,全部实现了指定的构造器方法。
right 指明同一优先级的运算符执行顺序是从右到左。
Type 表示任意类型的类型,包括类类型、结构类型、枚举类型、协议类型。
unowned 让循环引用中的实例 A 不要强引用实例 B。前提条件是实例 B 的生命周期要长于 A 实例。如果 B 提前释放,会导致悬垂指针。
weak 允许循环引用中的实例 A 弱引用实例 B ,而不是强引用。实例 B 的生命周期更短,并会被先释放。
get 获取变量
set 变量赋值时调用,和 get 配合使用
didSet 变量赋值完成后调用,和 get set不能同时在
willSet 变量赋值前调用,和 get set不能同时在
起始于数字标记(#)的关键字 #available 基于平台参数,通过 if guard while 等语句检查API可用性
#column 用于获取字面量表示式的起始列数。
#if 件编译控制语句,用于控制程序在符合条件下执行代码
#else 件编译控制语句,用于控制程序在不同条件下执行不同代码
#elseif 件编译控制语句,用于控制程序在不同条件下执行不同代码
#endif 条件编译控制语句,用于控制程序在不同条件下执行代码。用于表明条件编译代码的结尾。
#file 返回当前代码所在源文件的名称。
#function 返回函数名称。
#line 用于获取当前代码的行数。
#selector 用于创建 Objective-C selector 的表达式,可以静态检查方法是否存在,并暴露给 Objective-C。
#sourceLocation 行控制语句,可以指定与原先完全不同的行数和源文件名。通常在 Swift 诊断、debug 时使用。
特性中的关键字(@) @available 将 available 特性用于声明时,表示该声明的生命周期与特定的平台和操作系统版本有关。
@discardableResult 表示取消不使用返回值的警告
@GKInspectable 把组件属性显示到 SpriteKit 编辑器界面中
@nonobjc 主要的作用是告诉编译器其申明在OC中不可用
@objc 主要的作用是告诉编译器其申明在OC中可用
@NSCopying 让属性值(由 copyWithZone(_:) 方法返回,而不是属性本身的值)的拷贝合成属性的setter
@NSManaged 表明属性或方法的实现由 Core Data 在运行时基于相关实体描述动态提供。
@objcMembers @testable 如果你使用 @testable 属性标注了导入的生产模块并且用使能测试的方式编译了这个模块,单元测试目标就能访问任何 internal 的实体。
@NSApplicationMain 在某个类上使用@NSApplicationMain特性表示该类是应用程序代理类,使用该特性与调用 NSApplicationMain(::) 函数并且把该类的名字作为代理类的类型传递给函数的效果相同。
@UIApplicationMain 在某个类上使用@UIApplicationMain特性表示该类是应用程序代理类,使用该特性与调用 UIApplicationMain(::) 函数并且把该类的名字作为代理类的类型传递给函数的效果相同。
@IBAction 用于修饰一个类的方法声明,结合Interface Builder使用
@IBOutlet 用于修饰一个类的属性声明,结合Interface Builder使用
@IBDesignable 用于修饰类的声明,结合Interface Builder使用。
@IBInspectable 用于修饰一个类的属性声明,结合Interface Builder使用
@autoclosure 把表达式自动封装成无参数的闭包来延迟表达式的计算
@escaping 用于申明逃逸闭包
@convention 用于修饰函数类型,它指出了函数调用的约定
最后 以上就是本篇的内容,本篇只是对关键词做一个简单的解释,并没有附上相关的示例代码。
势必会有一些遗漏和错误的地方,欢迎斧正~
参考文章 "Swift关键字总结上篇"
"Swift关键字总结下篇"
"Swift 关键字"

    推荐阅读