copy on write(写时复制):
简单的说就是,只有当一个结构体发生了写入行为时才会有复制行为。具体的做法就是,在结构体内部用一个引用类型来存储实际的数据,在不进行写入操作的普通传递过程中,都是将内部的reference的应用计数+1,在进行写入操作时,对内部的reference做一次copy操作用来存储新的数据,防止和之前的reference产生意外的数据共享。
Range Operations
1...5 // 1, 2, 3, 4, 5
1..<5 // 1, 2, 3, 4
[2...] // >=2 的数字
[...2] // <=2的数字
// 全校学生
let allStudents: [Student] = getSchoolStudents()
map:用于映射,可以将一个列表转换为另外一个列表
[1, 2, 3].map {"\($0)"} // ["1", "2", "3"]
allStudents.map { student in student.parent }
flatMap:对序列内的元素进行展开
["Hi","Swift"].flatMap { $0 } // ["H", "i", "S", "w", "i", "f", "t"]
forEach: 对全部元素执行特定方法
allStudents.forEach { std in print("score: \(std.score), name: \(std.name)") }
sort和sorted:排序
allStudents.sort { std1, std2 in std.score > std2.score }
// 会产生新的排序数组
let sortStudents = allStudents.sorted { std1, std2 in std.score > std2.score }
reduce:合并一个确定的序列,并返回单个值
// 传入初始值0,然后根据后面{}的规则合并数组
[1, 2, 3].reduce(0).{$0 + $1} // 6
filter:用于过滤, 可以筛选出想要的元素
[1,3,5,7].filter{ $0 > 3} // [5, 7]
allStudents.filter { student in student.grade == 3 && student.class == 2 }
合并使用
let tmp2 = [1,3,5,7].filter{ $0 >= 3} .map{$0+1}.reduce(0){$0+$1} // 18
defer :就是 defer block 里的代码会在函数 return 之前执行。无论函数是从哪个分支 return 的,还是有 throw的,都会在代码块的最后执行defer block。
权限控制关键字
final:
可以防止类被继承,还可以防止子类重写父类的属性、方法以及下标。需要注意的是,final修饰符只能用于类,不能修饰结构体和枚举,因为结构体和枚举只能遵循协议。
- 修饰类,表明该类不能被其他类继承,也就是它没资格当父类。
- 修饰类中的属性、方法和下标,但前提是该类并没有被final修饰过。
- 不能修饰结构体和枚举。
open和public
这两个都用于在模块中声明需要对外界暴露的函数, 区别在于, public 修饰的类, 在模块外无法继承, 而 open 则可以任意继承, 公开度来说, public < open。
static 和 class 修饰方法时的区别
static 定义的方法不可以被子类继承, class 则可以。
非class类型 一般 统一用 static 。例如 枚举 结构体
protocol中 使用 static ,实现协议的 枚举 结构体 用 static
class 中使用 class static 都可以
mutating的作用
在Swift中,包含三种类型(type): structure,enumeration,class。
其中structure和enumeration是值类型(value type),class是引用类型(reference type)。值类型在初始化时,都赋值有默认值,在实例方法中并不能修改。然而使用mutating关键字修饰的实例方法,可以在方法内改变值类型的变量,并返回到原始结构中去。
自定义下标获取值
class IndexDemo: NSObject {
}
extension IndexDemo {
subscript(index: Int) -> Int {
get {
// 返回一个适当的 Int 类型的值
return number
}
set(newValue) {
// 执行适当的赋值操作
}
}
}
网友评论