语法糖
- let声明的是常量不可以改,var声明的是变量
- 值永远不会被隐式转换为其他类型。如果你需要把一个值转换成其他类型,请显式转换。如:
let label = "The width is"
let width = 94
let widthLabel = label + String(width)
- 使用[]来创建数组和字典,可以用[]和[:]来创建空数组和空字典
shoppingList = []
occupations = [:]
- 在类型后面加一个?来标记这个变量的值是可选的,使用!来表示一个是肯定有的。
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要惊叹号来获取值
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // 不需要感叹号
- ?? 操作符可以对比选择一个不为空的值。(var a = ( b ?? c))
- 使用..< 创建的范围不包含上界,如果想包含的话需要使用...
- lazy 作为属性修饰符时,只能声明属性是变量。另外我们需要显式地指定属性类型,并使用一个可以对这个属性进行赋值的语句来在首次访问属性时运行。如果我们多次访问这个实例的str
属性的话,可以看到只有一次输出。
lazy var str: String = { let str = "Hello" print("只在首次访问输出") return str }()
- 使用func来声明一个函数,使用名字和参数来调用函数。使用->来指定函数返回值的类型。
- 函数可以嵌套。被嵌套的函数可以访问外侧函数的变量.
- 函数是第一等类型,这意味着函数可以作为另一个函数的返回值。
func makeIncrementer() -> (Int -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
- 函数也可以当做参数传入另一个函数。
func hasAnyMatches(list: [Int], condition: Int -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false
}
func lessThanTen(number: Int) -> Bool {
return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, condition: lessThanTen)
- 你可以使用{}来创建一个匿名闭包。使用in将参数和返回值类型声明与闭包函数体进行分离。
numbers.map({
(number: Int) -> Int in
let result = 3 * number
return result
})
- 要创建一个类的实例,在类名后面加上括号。使用点语法来访问实例的属性和方法。使用init来创建一个构造器。使用deinit创建一个析构函数。
class classname{
init(){}
deinit(){}
}
- 子类的定义方法是在它们的类名后面加上父类的名字,用冒号分割。
class classname:parentname{
}
- 子类如果要重写父类的方法的话,需要用override标记——如果没有添加override就重写父类方法的话编译器会报错。编译器同样会检测override标记的方法是否确实在父类中。
- 处理变量的可选值时,你可以在操作(比如方法、属性和子脚本)之前加?。如果?之前的值是nil,?后面的东西都会被忽略,并且整个表达式返回nil。否则,?之后的东西都会被运行。在这两种情况下,整个表达式的值也是一个可选值。
- 类里的setter方法,新值默认用newValue作为变量
- 枚举enum里,使用rawValue属性来访问一个枚举成员的原始值
- 使用struct来创建一个结构体。结构体和类有很多相同的地方,比如方法和构造器。它们之间最大的一个区别就是结构体是传值,类是传引用。
- 泛型,在尖括号里写一个名字来创建一个泛型函数或者类型。
差不多先这些吧。