美文网首页
Swift 学习 - 关键词

Swift 学习 - 关键词

作者: Tony17 | 来源:发表于2020-03-06 23:04 被阅读0次

前言

学习 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

用于修饰函数类型,它指出了函数调用的约定

最后

以上就是本篇的内容,本篇只是对关键词做一个简单的解释,并没有附上相关的示例代码。
势必会有一些遗漏和错误的地方,欢迎斧正~

参考文章

"Swift关键字总结上篇"

"Swift关键字总结下篇"

"Swift 关键字"

相关文章

网友评论

      本文标题:Swift 学习 - 关键词

      本文链接:https://www.haomeiwen.com/subject/bdaarhtx.html