关键词
- mutating
用于修饰协议中的方法,是因为考虑到在被struct,enum 实现该协议的方法时,能在该方法中修改 成员变量,而在类中不用特意声明,是因为在class 中 成员变量对于方法来说都是透明的
以下代码中,
如果协议方法 不作声明mutating
,会报错 没有实现该方法
如果 struct 和 enum中不声明mutating
,会报错,不能修改实例变量
protocol ExampleProtocol {
var simpleDescription: String { get }
mutating func adjust()
}
// 定义类 实现该协议
class SimpleClass: ExampleProtocol {
var simpleDescription: String = "A very simple class"
var anotherProperty: Int = 110
// 在 class 中实现带有mutating方法的接口时,不用mutating进行修饰。因为对于class来说,类的成员变量和方法都是透明的,所以不必使用 mutating 来进行修饰
func adjust() {
simpleDescription += " Now 100% adjusted"
}
}
// 定义 struct 实现该协议
struct SimpleStruct: ExampleProtocol {
var simpleDescription: String = "A simple structure"
mutating func adjust() {
simpleDescription += "(adjusted)"
}
}
//在 enum 中 实现该协议
enum SimpleEnum: ExampleProtocol {
case First, Second, Third
var simpleDescription: String {
get {
switch self {
case .First:
return "first"
case .Second:
return "second"
case .Third:
return "third"
}
}
set {
simpleDescription = newValue
}
}
mutating func adjust() {
}
}
- final
swift4 新增
可以修饰 class ,fun,var
被修饰的对象 无法被继承 - defer
会在当前作用域结束时执行,执行顺序为逆序,defer 中捕获的变量值是可以改变的 - deinit
属于析构函数,析构函数和构造函数相反,当对象结束其声明周期时,系统自动执行析构函数(相当于OC的delloc) - associatedtype
在协议中除了定位属性和方法外 ,还可以定义 类型占位符,让实现协议的类型 来指定类型
protocol Animal {
associatedtype F: Food
func eat(_ food: F)
}
struct Meat: Food { }
struct Grass: Food { }
struct Tiger: Animal {
func eat(_ food: Meat) {
print("eat \(food)")
}
}
struct Sheep: Animal {
func eat(_ food: Grass) {
print("eat \(food)")
}
}
- subscript
下标索引修饰,可以让class,enum,struct使用下标访问内部值
struct TimesTable {
let multiplier: Int
subscript(index: Int) -> Int {
return multiplier * index
}
}
//使用
let times = TimesTable(multiplier: 3)
let time = times[3]
- typealias
为类型声明一个别名,和typedef 类似 - override
如果我们要重写某个方法或者某个属性的话,需要在重写的变量前增加一个override关键字 - fallthrough
swift语言特性,switch语句的break 语句可以忽略不写,满足条件时直接跳出循环,fallthrough
的作用就是执行完当前的case,继续执行下面的case,类似于其他语言中省去break 会继续往后一个break跑,直到碰到break 或者default 才完成的效果
let type: Int = 3
var name: String = ""
switch type {
case 1, 2, 3, 4, 5, 6:
name += "\(type)"
fallthrough
case 8:
name += "哈哈哈哈"
case 9:
name += "嗯~"
default:
name += "结束了"
}
- inout
inout 作为函数声明时,引用传值的关键字。但是在调用的时候引用的是地址,所以在引用的时候要加上&
func test(a: inout Int, b: inout Int) {
let num = a + b
print(num)
}
//使用
var a = 3
var b = 5
test(a: &a, b: &b)
-
@discardableResult
正常的swift 方法 如果有返回值的话,在调用的时候 得有个变量去接收,如果不接收的话 会有警告,如果不想接收 又不想要警告,可以在方法声明的时候 在方法名上面 加上@discardableResult
改进:
class PHAssetController: PHBaseViewController {
override func viewDidLoad() {
super.viewDidLoad()
getNumber()
}
@discardableResult
func getNumber() -> Int {
return 9;
}
}
访问关键词
- private
只能在当前类被访问,swift4中,extension里也可以访问private的属性 - filePrivate
swift3 新增。
对原来的private 进行细分
所修饰的属性或者方法在当前的源文件中可以被访问 - open
swift3新增
可以在任何地方被访问,继承和重写
对原来的public进行细分 - public
可以在任何地方被访问,在其他模块中不能被继承和重写 - internal
默认关键字,可以在本模块内任意被访问