3.1 变量的作用域和生命周期
- 全局变量:同一模块的全局变量相互可见。
- 属性 (实例属性、静态属性)
- 局部变量
3.2 变量声明
let
var (变量的类型不能变)
3.3 计算后的初始化
通过匿名函数。
3.4 可计算的变量
即变量可以有函数。
例如变量的setter 和getter方法:
var now:String{
get {
return NSDate().description
}
set{
print(newValue)
}
}
注意点:
- 必须是变量,同时明确声明类型
- get是一个非正式的函数,必须有返回值
- set是一个非正式的带有一个参数的函数,不必是newValue
- 必须有getter。如果没有setter,get和{}可以省略
var now:String{
return NSDate().description
}
3.5 Setter Observers
比起使用3.4 来,更加明智
var s="whatever"{
willSet{
print(newValue)
}
didSet{
print(oldValue)
}
}
注意点:
1. 必须是变量,可以赋给初始值
2. willSet 是在赋予新值之前,新值作为参数 可以在willSet之后(新名称)
3. didSet 是在赋予新值之后,旧值作为参数 可以在didSet之后(新名称)
3.6 延迟初始化
有以下三种情况:
- 全局变量:自动延迟初始化
- 静态属性:同1
- 实例属性:需要手动 lazy。必须为var。(当需要在初始化的时候引用实例)
3.7 内置的简单类型
3.7.1 Bool
true false
与其他语言不同,其他类型不会隐式的被当做Bool。
3.7.2 数值
主要是Int 和Double,其他类型的存在主要是为了与C、OC兼容
3.7.2.1 Int
所表示的范围依赖于具体平台。
_ 增强可读性
前置的0为了对齐
3.7.2.2 Double
3.7.2.3 类型转换
Double(y)
隐式转换只针对于字面量用于变量赋值,或作为参数传递给函数,用作算数运算。
3.7.2.4 算术运算
+ - * / %
& | ^ ~
<< >>
let i=Int.max-2
let (j,over)=Int.addWithOverflow(i,12/2)
使用&+、&-、&* 来不关心溢出
+=、-=、*=、/=、%=、&=、|=、^=、~=、<<=、 >>=
++ --
3.7.2.5 比较
==、!=、<、<=、>、>=
3.7.3 String
let greeting ="hello"
let left="\u{21DA}"
\()
许多字符串的函数操作 都在UIKit 和Foundation中,
swift中的String是以characters 来计算长度的
NSString中是以代码点计算长度
3.7.4 Character
生成一个Character对象
let c=Character("h")
3.7.5 Range
...
..<
3.7.7.5 与Optional比较
与非nil 比较时,比较的是包含的值。
let s:String?="howdy"
if s=="howdy"{
//相等的
}
3.7.7.6 why Optionals?
与OC兼容。