float value = 0.001; if (value) { NSLog(@"value:%f",value); } // 输出: value:0.001000
而在Swift中会编译报错
1 2 3 4
let boolValue =0.001 if boolValue { print("value is true") }
3.2、可选类型
3.2.1、可选类型
使用可选类型(optionals)来处理值可能缺失的情况。
1 2 3
let possibleNumber ="123" let convertedNumber =Int(possibleNumber) // convertedNumber 被推测为类型 "Int?", 或者类型 "optional Int"
因为该构造器可能会失败,所以它返回一个可选类型(optional)Int,而不是一个 Int。一个可选的 Int 被写作 Int? 而不是 Int。问号暗示包含的值是可选类型,也就是说可能包含 Int 值也可能不包含值。(不能包含其他任何值比如 Bool 值或者 String 值。只能是 Int 或者什么都没有。)
3.2.2、隐式解析可选类型
可选类型 String 和隐式解析可选类型 String 之间的区别:
1 2 3 4 5
let possibleString: String? ="An optional string." let forcedString: String= possibleString!// 需要感叹号来获取值
let assumedString: String! ="An implicitly unwrapped optional string." let implicitString: String= assumedString // 不需要感叹号
在 Swift 中,nil 不是指针——它是一个确定的值,用来表示值缺失。 任何类型的可选状态都可以被设置为 nil,不只是对象类型。
你可以给可选变量赋值为nil来表示它没有值:
1 2 3 4
var serverResponseCode: Int? =404 // serverResponseCode 包含一个可选的 Int 值 404 serverResponseCode =nil // serverResponseCode 现在不包含值
强制解析
1 2 3 4 5 6 7
//let possibleNumber = "123" //let convertedNumber = Int(possibleNumber) var convertedNumber: Int? =123 if convertedNumber !=nil { print("convertedNumber has an integer value of \(convertedNumber!).") //当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个惊叹号表示“我知道这个可选有值,请使用它。”这被称为可选值的强制解析(forced unwrapping): } // 输出 "convertedNumber has an integer value of 123."
可选绑定
在 if 语句中写一个可选绑定:
1 2 3
iflet constantName = someOptional { statements }
举例:
1 2 3 4 5 6
iflet actualNumber =Int(possibleNumber) { print("\'\(possibleNumber)\' has an integer value of \(actualNumber)") //转换成功,因为它已经被可选类型 包含的 值初始化过,所以不需要再使用 ! 后缀来获取它的值。 } else { print("\'\(possibleNumber)\' could not be converted to an integer") } // 输出 "'123' has an integer value of 123"
这段代码可以被理解为:“如果 Int(possibleNumber) 返回的可选 Int 包含一个值,创建一个叫做 actualNumber 的新常量并将可选包含的值赋给它。”
二、基本运算符
1、赋值运算符
与 C 语言和 Objective-C 不同,Swift 的赋值操作并不返回任何值。所以以下代码是错误的:
1 2 3
if x = y { // 此句错误, 因为 x = y 并不返回任何值 }
这个特性使你无法把(==)错写成(=),由于 if x = y 是错误代码,Swift 能帮你避免此类错误发生。
如果赋值的右边是一个多元组,它的元素可以马上被分解成多个常量或变量:
1 2
let (x, y) = (1, 2) // 现在 x 等于 1,y 等于 2
2、算术运算符
加法运算符也可用于 String 的拼接:
1
"hello, "+"world"// 等于 "hello, world"
在新版Swift中,++ 和 – 运算符被取消,因此 i++ 这种形式的累加需要换成 i += 1 这种形式。
3、一元正号/负号运算符
1 2 3 4
let tempValue =-6 let plusSix =-tempValue // plusSix 等于 6 let minusSix =+tempValue // minusSix 等于 -6 //当你在使用一元负号来表达负数时,你可以使用一元正号来表达正数,如此你的代码会具有对称美。
4、比较运算符(Comparison Operators)
比较运算多用于条件语句,如if条件:
1 2 3 4 5 6 7
let name ="world" if name =="world" { print("hello, world") } else { print("I'm sorry \(name), but I don't recognize you") } // 输出 "hello, world", 因为 `name` 就是等于 "world"
5、空合运算符(Nil Coalescing Operator)
空合运算符(a ?? b)将对可选类型 a 进行空判断,如果 a 包含一个值就进行解封,否则就返回一个默认值 b。表达式 a 必须是 Optional 类型。默认值 b 的类型必须要和 a 存储值的类型保持一致。
1 2 3
a ?? b // 空合运算符 // 等价于 a !=nil? a! : b // 三目运算符
注意: 如果 a 为非空值(non-nil),那么值 b 将不会被计算。这也就是所谓的短路求值。
6、区间运算符(Range Operators)
写法
示例
闭区间运算符
a…b
for index in 1…5 {}
闭区间运算符的单侧形式
[a…]或[…b]
for name in names[2…] { print(name) }
半开区间运算符
a..<b
for i in 0..<count {}
半开区间运算符的单侧形式
[..<b]
7、逻辑运算符(Logical Operators)
注意: Swift 逻辑操作符 && 和 || 是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的子表达式。为使得代码更加可读,建议使用括号来明确优先级