目录

基本概念

数据类型

    """
    hello,
    world
    """

函数

ℹ️note

被捕获的变量必须在闭包定义时可见,否则编译报错; 被捕获的变量必须在闭包定义时已经完成初始化,否则编译报错。

func returnAddNum(): (Int64) -> Int64 {
  let num: Int64 = 10

  func add(a: Int64) {
      return a + num
  }
  add
}
// 闭包add捕获局部变量num,调用returnAddNum后,已脱离其作用域,局部变量num已销毁,但调用add时可正常访问num
main() {
  let f = returnAddNum()
  println(f(10))
}
ℹ️note

如果捕获了var变量的闭包赋值给其他变量或作为函数实参使用,会发生闭包逃逸,var变量可被修改,这样会扩大闭包的作用范围,做成内存浪费或泄漏。

此类闭包只能被调用,不能作为一等公民使用,包括不能赋值给变量,不能作为实参或返回值使用,不能直接将闭包的名字作为表达式使用。

捕获具有传递性,如果一个函数 f 调用了捕获 var 变量的函数 g,且存在 g 捕获的 var 变量不在函数 f 内定义,那么函数 f 同样捕获了 var 变量,此时,f 也不能作为一等公民使用。

func h(){
    var x = 1

    func g() {  x }   // captured a mutable variable

    func f() {
        g()      // invoked g
    }
    return f // Error
}

结构体

枚举

模式匹配

let score = 90
let a = match(score){
    case patter => {}
    case patter => {}
    case _ => {}
}

类和接口

泛型

扩展

集合类

let a = ArrayList<String>() // Created an empty ArrayList whose element type is String
let b = ArrayList<String>(100) // Created an ArrayList whose element type is String, and allocate a space of 100
let c = ArrayList<Int64>([0, 1, 2]) // Created an ArrayList whose element type is Int64, containing elements 0, 1, 2
let d = ArrayList<Int64>(c) // Use another Collection to initialize an ArrayList
let e = ArrayList<String>(2, {x: Int64 => x.toString()}) // Created an ArrayList whose element type is String and size is 2. All elements are initialized by specified rule function, [0, 1]

异常

并发编程

同步机制:原子操作,互斥锁以及条件变量。

  1. 每次调用 newCondition 都会将创建一个新的条件变量并与当前对象关联
  2. 不可以将一个 MultiConditionMonitor 实例返回的 ConditionID 传给其它实例,或者手动创建 ConditionID
  3. 由于 ConditionID 所包含的数据(例如内部数组的索引,内部队列的直接地址,或任何其他类型数据等)和创建它的 MultiConditionMonitor 相关,所以将“外部” conditonID 传入 MultiConditionMonitor 中会导致 IllegalSynchronizationStateException。 :::

编译构建