IOS

Swift

Swift 语法

Posted by nomadli on December 9, 2015

编译器相关

  • plaground 后缀可以在xcode中预览结果,作为代码temp来看效果。
  • swift 后缀为真正代码文件
  • 语句末尾不强制要求’;’

关键字

  • typealias 相当于 typedef

变量

  • 变量声明没有赋值,需要指明类型。在变量名后用’: ‘类型指定
  • 变量运算及赋值不会隐式类型转换。/(类型)等价string(类型)
  • let 常量声明,可以不赋值,运行时赋值,但仅能赋值一次。
  • var 变量声明,在类型后带?可以赋值nil
  • Array [,…] 数组,空数组[类型]()
  • Dictionary [key:value,…]() 字典, 空字典[kType:vType]()
  • (name:type,…) 元组
  • 函数作为数据类型,不在作为指针类型
  • 0b、0o、0x, e十进制、p十六进制指数

流控制

  • 条件不会隐式对比
  • 条件可以有括号也可以没括号,语句体必须使用{}
  • guard 拆包并判断条件不成立执行else
  • if #available(iOS 8.0, *)判断sdk版本
  • switch 可以比较任意类型,必须有default,无需break, case let x where…: fallthrough进入下一个case
  • for (key_, value_) in dic, ..<范围
  • while repeat代替do
  • ?? 类似三目操作符:, 左为nil则返回右值

函数

  • -> 指定返回值类型
  • …可变参数在函数体内以数组形式存取
  • inout 即使class实例是引用但也不能改,只能用inout
  • {参数->返回值 in 函数体}匿名函数
  • {参数名 in 函数体}参数和返回类型已知可省略,如函数参数
  • 函数体只有一行代码,可以不写return
  • 函数参数可以不命名而使用%0….
  • 函数可以多态、可以模板在函数名后T: where
  • defer 类似finish 在函数体结束后执行

闭包

  • @noescape 闭包作为参数,不会逃匿出本函数去执行。
  • @autoclosure 闭包参数,在闭包不含有参数时使用,可以让调用简单的提供一个表达式作为闭包,而不是使用{in表达式}。自动闭包含有noescape特性。
  • @autoclosure(escaping)可逃逸自动闭包
  • [捕获列表] 在参数前面 [weak self, unowned some](参数)->type

  • class name:base,…. base不是必须的
  • init 构造函数 convenience重载构造
  • deint 析构函数
  • override 重载函数
  • set、get 为计算属性、有set必须有get newValue
  • willSet、didSet 执行非计算属性的代码
  • is 判断是否是某个类型的实例
  • as 将实转换为某个类型的实例
  • subscript 下标索引函数
  • final 禁止重写继承
  • convenience 便利构造器
  • weak 弱引用 只能在可选属性
  • unowned 无主引用 在非可选属性
  • 隐式解析可选属性
  • operators prefix infix postfix 操作符
  • associativity left precedence right none 优先级

结构

  • struct 与类唯一的区别就是以传值的形式传递
  • mutating 会修改结构本身的函数

枚举

  • enum:type 可以不指定type,则没有原始值,自身为原始值
  • case 定义成员,用,分割成员,每行必case,成员可以是不同的类型
  • rawValue
  • hashValue
  • indirect 可递归 enum my case number(int) case add(my, my)
  • mutating 会修改枚举本身的方法

协议

  • protocol name
  • mutating 标记方法会改变属性,在struct中有必要,类中默认
  • protocol<protocol1,protocol2,..>

扩展

  • extention 只可以扩展方法、计算属性

模块

  1. module.modulemap module modulename [system] [extern_c] { header “path/name.h” [link “libname”] export * } module module name { explicit module name { header “path/name.h” [link “libname”] export * } explicit module name { header “path/name.h” [link “libname”] export * } }