前言
学习 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
定义一个协议时,有时在协议定义里声明一个或多个关联类型是很有用的。关联类型给协议中用到的类型一个占位符名称。直到采纳协议时,才指定用于该关联类型的实际类型。关联类型通过 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
用于修饰函数类型,它指出了函数调用的约定
最后
以上就是本篇的内容,本篇只是对关键词做一个简单的解释,并没有附上相关的示例代码。
势必会有一些遗漏和错误的地方,欢迎斧正~
网友评论