以“#”开头关键字
| 字面量 | 类型 | 含义 | 
|---|---|---|
| #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进行解包 判断非空的情况才把值取出来
if let customView = customView1 {
customView.removeFromSuperview()
}
// 如果customView1 为空,判断直接跳过,往下执行. 如果customView1 不为空,执行{}中的语句.
2. @discardableResult
去除警告
swift正常的方法如果有返回值的话,调用的时候必须有一个接收方,否则的话编译器会报一个警告,如果在方法前加上 @discardableResult 不处理的时候就不会有警告了.
@discardableResult
public func titleLabelString(_ attributedString: NSAttributedString?) -> Self {
titleLabel.attributedText = attributedString
return self
}
3. final
final关键字可以在class、func、var前修饰,表示不可重写,可以把类或者类中的部分实现保护起来,从而避免子类破坏。
class Person : NSObject {
//修饰词 final 表示 不可重写 可以将类或者类中的部分实现保护起来,从而避免子类破坏
final func language(){
//something price code here
//...
}
}
class Student: Person {
// 此处重写`final`修饰的language方法,报错 “Instance method overrides a 'final' instance method”
// override func language(){
//
// }
}
4. override
重写方法
如果我们要重写某个方法, 或者某个属性的话, 我们需要在重写的变量前增加一个override关键字。我们看下系统的继承方法
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
5. subscript
下标
subscript关键字表示下标,可以让class、struct、以及enum使用下标访问内部的值。其实就可以快捷方式的设置或者获取对应的属性, 而不需要调用对应的方法去获取或者存储, 比如官网的一个实例:
struct Matrix {
let rows: Int, columns: Int
var grid: [Double]
init(rows: Int, columns: Int) {
self.rows = rows
self.columns = columns
grid = Array(repeating: 0.0, count: rows * columns)
}
func indexIsValid(row: Int, column: Int) -> Bool {
return row >= 0 && row < rows && column >= 0 && column < columns
}
//实现`subscript`方法
subscript(row: Int, column: Int) -> Double {
get {
assert(indexIsValid(row: row, column: column), "Index out of range")
return grid[(row * columns) + column]
}
set {
assert(indexIsValid(row: row, column: column), "Index out of range")
grid[(row * columns) + column] = newValue
}
}
}
func matrixTest(){
var matrix = Matrix(rows: 2, columns: 2)
matrix[0, 1] = 1.5
matrix[1, 0] = 3.2
print("matrix == \(matrix)")
/**
打印结果:
matrix == Matrix(rows: 2, columns: 2, grid: [0.0, 1.5, 3.2, 0.0])
*/
}
6. mutating
mutating关键字指的是可变即可修改。用在structure和enumeration中,虽然结构体和枚举可以定义自己的方法,但是默认情况下,实例方法中是不可以修改值类型的属性。为了能够在实例方法中修改属性值,可以在方法定义前添加关键字mutating。
public mutating func fetchSetingsList(index: Int) -> [MyViewSetingInfo] {
let dataSoure: [[MyViewSetingInfo]] = [accountList,setingsList,messageList]
guard index < dataSoure.count else { return [MyViewSetingInfo(title: "错误", subTitle: "错误", className: "")]}
return dataSoure[index]
}
7. typealias
使用关键字typealias定义类型别名(typealias就相当于objective-c中的typedef),就是将类型重命名,看起来更加语义化。说人话就是:起别名。
typealias Width = Float
typealias Height = Float
func rectangularArea(width:Width, height:Height) -> Double {
return Double(width*height)
}
8. init
init关键字也表示构造器,初始化方法,在init后面加个”?”号, 表明该构造器可以允许失败。
class PerSon {
var name:String
init?(name : String) {
if name.isEmpty { return nil }
self.name = name
}
}
9. required
required是用来修饰init方法的,说明该构造方法是必须实现的。
class Father: NSObject {
var name: String?
required init(name: String) {
self.name = name
}
}
class Son: Father {
required init(name: String) {
super.init(name: name)
self.name = name
}
}
从上面的代码示例中不难看出,如果子类需要添加异于父类的初始化方法时,必须先要实现父类中使用required修饰符修饰过的初始化方法,并且也要使用required修饰符而不是override。
使用required的注意点:
- required修饰符只能用于修饰类初始化方法。
- 当子类含有异于父类的初始化方法时(初始化方法参数类型和数量异于父类),子类必须要实现父类的required初始化方法,并且也要使用required修饰符而不是override。
- 当子类没有初始化方法时,可以不用实现父类的required初始化方法。
10. convenience
使用convenience修饰的构造函数叫做便利构造函数 。便利构造函数通常用在对系统的类进行构造函数的扩充时使用。
便利构造函数的特点如下:
- 便利构造函数通常都是写在extension里面
- 便利函数init前面需要加载convenience
- 在便利构造函数中需要明确的调用self.init()
11. deinit
deinit属于析构函数,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。和OC中的dealloc 一样的。
我们通常在deinit函数中进行一些资源释放和通知移除等。
列举如下:
在swift中,fallthrough的作用是就是在switch-case中执行完当前case,继续执行下面的case.
13. 访问权限关键字
private:
fileprivate:
internal:
public:
open:
可以在多个targets中调用. 并且可以重写方法
14 . @state
struct ContentView : View {
@State private var brain: CalculatorBrain = .left("0")
var body: some View {
// ...
}
}
@state 修饰的值,在SwiftUI 内部会被自动转换为一对setter 和getter,对这个属性进行赋值的操作将会触发View 的刷新,它的body 会被再次调用,底层渲染引擎会找出界面上被改变的部分,根据新的属性值计算出新
的View,并进行刷新。
@State 属性值仅只能在属性本身被设置时会触发UI 刷新,这个特性让它非常适合用来声明一个值类型的值
对于@State 修饰的属性的访问,只能发生在body 或者body 所调用的方法中。你不能在外部改变@State 的值,它的所有相关操作和状态改变都应该是和当前View 挂钩的
15. @Binding
和@State 类似,@Binding 也是对属性的修饰,它做的事情是将值语义的属性“转换” 为引用语义。对被声明为@Binding 的属性进行赋值,改变的将不是属性本身,而是它的引用,这个改变将被向外传递。

 
                         
                                

