VCG211162991370.jpg

以“#”开头关键字

字面量 类型 含义
#file String 所在的文件
#function String 所在的方法
#line Int 所在的行
#column Int 所在的列
#if * *
#else#elseif * *
#endif * *
#available * *
#selector * *

声明关键字

字面量 类型 含义
import 引用 引入框架
class 声明 声明一个类和声明类方法
struct 声明 结构体
enum 声明 枚举
protocol 声明 协议
extension 声明 扩展
func 声明 方法
let 声明 一个不可变的常量
var 声明 一个可变的变量
init 构造 构造函数
deinit 构造 解构函数
static 修饰 静态修饰
typealias 修饰 别名修饰
subscript 修饰 下标
override 修饰 子类重写父类变量或方法
mutating 修饰 方法前添加,修饰可变对象,可变即可修改
private 访问级别 只在当前类中调用 ,不能在extension中调用
fileprivate 访问级别 限于当前文件下或当前文件下当前类调用
Internal 访问级别 默认访问级别
public 访问级别 公开访问不能被子类重写
open 访问级别 公开访问可以被子类重写
final 访问级别 在class、func和var前修饰,表示不可重写

与语句有关的关键字

字面量 类型 含义
break * *
case * *
continue * *
default * *
do * *
else * *
fallthrough * *
if * *
in * *
for * *
return * *
switch * *
where * *
while * *

表达式和类型关键字

字面量 类型 含义
as * 强转
dynamicType * 获取对象动态类型
is * 类型判断
new * *
super * *
self * *
Self * *
Type * *

在特定上下文中使用的关键字

字面量 类型 含义
associativity * *
didSet * *
get * *
infix * *
inout * *
left * *
mutating * *
none * *
nonmutating * *
operator * *
override * *
postfix * *
precedence * *
prefix * *
rightset * *
unowned * *
unowned(safe) * *
unowned(unsafe) * *
weak * *
willSet * *

其他关键字

1. if let

swift里面有optional可选类型情况,也叫封包处理
可以通过 if let进行解包 判断非空的情况才把值取出来

  1. if let customView = customView1 {
  2. customView.removeFromSuperview()
  3. }
  4. // 如果customView1 为空,判断直接跳过,往下执行. 如果customView1 不为空,执行{}中的语句.

2. @discardableResult

去除警告

swift正常的方法如果有返回值的话,调用的时候必须有一个接收方,否则的话编译器会报一个警告,如果在方法前加上 @discardableResult 不处理的时候就不会有警告了.

  1. @discardableResult
  2. public func titleLabelString(_ attributedString: NSAttributedString?) -> Self {
  3. titleLabel.attributedText = attributedString
  4. return self
  5. }

3. final

final关键字可以在classfuncvar前修饰,表示不可重写,可以把类或者类中的部分实现保护起来,从而避免子类破坏。

  1. class Person : NSObject {
  2. //修饰词 final 表示 不可重写 可以将类或者类中的部分实现保护起来,从而避免子类破坏
  3. final func language(){
  4. //something price code here
  5. //...
  6. }
  7. }
  8. class Student: Person {
  9. // 此处重写`final`修饰的language方法,报错 “Instance method overrides a 'final' instance method”
  10. // override func language(){
  11. //
  12. // }
  13. }

4. override

重写方法

如果我们要重写某个方法, 或者某个属性的话, 我们需要在重写的变量前增加一个override关键字。我们看下系统的继承方法

  1. override func viewDidLoad() {
  2. super.viewDidLoad()
  3. // Do any additional setup after loading the view.
  4. }

5. subscript

下标
subscript关键字表示下标,可以让classstruct、以及enum使用下标访问内部的值。其实就可以快捷方式的设置或者获取对应的属性, 而不需要调用对应的方法去获取或者存储, 比如官网的一个实例:

  1. struct Matrix {
  2. let rows: Int, columns: Int
  3. var grid: [Double]
  4. init(rows: Int, columns: Int) {
  5. self.rows = rows
  6. self.columns = columns
  7. grid = Array(repeating: 0.0, count: rows * columns)
  8. }
  9. func indexIsValid(row: Int, column: Int) -> Bool {
  10. return row >= 0 && row < rows && column >= 0 && column < columns
  11. }
  12. //实现`subscript`方法
  13. subscript(row: Int, column: Int) -> Double {
  14. get {
  15. assert(indexIsValid(row: row, column: column), "Index out of range")
  16. return grid[(row * columns) + column]
  17. }
  18. set {
  19. assert(indexIsValid(row: row, column: column), "Index out of range")
  20. grid[(row * columns) + column] = newValue
  21. }
  22. }
  23. }
  24. func matrixTest(){
  25. var matrix = Matrix(rows: 2, columns: 2)
  26. matrix[0, 1] = 1.5
  27. matrix[1, 0] = 3.2
  28. print("matrix == \(matrix)")
  29. /**
  30. 打印结果:
  31. matrix == Matrix(rows: 2, columns: 2, grid: [0.0, 1.5, 3.2, 0.0])
  32. */
  33. }

6. mutating

mutating关键字指的是可变即可修改。用在structure和enumeration中,虽然结构体和枚举可以定义自己的方法,但是默认情况下,实例方法中是不可以修改值类型的属性。为了能够在实例方法中修改属性值,可以在方法定义前添加关键字mutating。

  1. public mutating func fetchSetingsList(index: Int) -> [MyViewSetingInfo] {
  2. let dataSoure: [[MyViewSetingInfo]] = [accountList,setingsList,messageList]
  3. guard index < dataSoure.count else { return [MyViewSetingInfo(title: "错误", subTitle: "错误", className: "")]}
  4. return dataSoure[index]
  5. }

7. typealias

使用关键字typealias定义类型别名(typealias就相当于objective-c中的typedef),就是将类型重命名,看起来更加语义化。说人话就是:起别名

  1. typealias Width = Float
  2. typealias Height = Float
  3. func rectangularArea(width:Width, height:Height) -> Double {
  4. return Double(width*height)
  5. }

8. init

init关键字也表示构造器,初始化方法,在init后面加个”?”号, 表明该构造器可以允许失败。

  1. class PerSon {
  2. var name:String
  3. init?(name : String) {
  4. if name.isEmpty { return nil }
  5. self.name = name
  6. }
  7. }

9. required

required是用来修饰init方法的,说明该构造方法是必须实现的。

  1. class Father: NSObject {
  2. var name: String?
  3. required init(name: String) {
  4. self.name = name
  5. }
  6. }
  7. class Son: Father {
  8. required init(name: String) {
  9. super.init(name: name)
  10. self.name = name
  11. }
  12. }

从上面的代码示例中不难看出,如果子类需要添加异于父类的初始化方法时,必须先要实现父类中使用required修饰符修饰过的初始化方法,并且也要使用required修饰符而不是override。

使用required的注意点:

  • required修饰符只能用于修饰类初始化方法。
  • 当子类含有异于父类的初始化方法时(初始化方法参数类型和数量异于父类),子类必须要实现父类的required初始化方法,并且也要使用required修饰符而不是override。
  • 当子类没有初始化方法时,可以不用实现父类的required初始化方法。

10. convenience

使用convenience修饰的构造函数叫做便利构造函数 。便利构造函数通常用在对系统的类进行构造函数的扩充时使用。
便利构造函数的特点如下:

  1. 便利构造函数通常都是写在extension里面
  2. 便利函数init前面需要加载convenience
  3. 在便利构造函数中需要明确的调用self.init()

11. deinit

deinit属于析构函数,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。和OC中的dealloc 一样的。
我们通常在deinit函数中进行一些资源释放和通知移除等。

列举如下:

  1. 对象销毁
  2. KVO移除
  3. 移除通知
  4. NSTimer销毁

    12. fallthrough

在swift中,fallthrough的作用是就是在switch-case中执行完当前case,继续执行下面的case.

13. 访问权限关键字

private:

可在本类中调用

fileprivate:

本Swift文件中调用

internal:

在targets中调用 (默认权限)

public:

可以在多个targets中调用

open:

可以在多个targets中调用. 并且可以重写方法

14 . @state

  1. struct ContentView : View {
  2. @State private var brain: CalculatorBrain = .left("0")
  3. var body: some View {
  4. // ...
  5. }
  6. }

@state 修饰的值,在SwiftUI 内部会被自动转换为一对setter 和getter,对这个属性进行赋值的操作将会触发View 的刷新,它的body 会被再次调用,底层渲染引擎会找出界面上被改变的部分,根据新的属性值计算出新
的View,并进行刷新。
@State 属性值仅只能在属性本身被设置时会触发UI 刷新,这个特性让它非常适合用来声明一个值类型的值

对于@State 修饰的属性的访问,只能发生在body 或者body 所调用的方法中。你不能在外部改变@State 的值,它的所有相关操作和状态改变都应该是和当前View 挂钩的

15. @Binding

和@State 类似,@Binding 也是对属性的修饰,它做的事情是将值语义的属性“转换” 为引用语义。对被声明为@Binding 的属性进行赋值,改变的将不是属性本身,而是它的引用,这个改变将被向外传递