下面是swift语言中于OC 不一样的地方
三元条件运算符
三元条件运算符是一种特殊的运算符,有三个部分,其形式为question? answer1:answer2.这是一个用来测试两种表达式基于输入是真或是 假的快捷方式。如果question? 为真时, 它评估answer1并返回其值; 否则,它评估answer2并返回其值。三元条件运算符是下面的代码的简化:
if question {
answer1
} else {
answer2
}
这里举一个列子,计算一个表行像素的高度,如果行有一个头,行高应该是50像素,比内容要高度要高。如果行没有头是20像素:
let contentHeight = 40
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? 50 : 20)
// rowHeight is equal to 90
前面的例子也可以用下面的的代码:
let contentHeight = 40
let hasHeader = true
var rowHeight = contentHeight
if hasHeader {
rowHeight = rowHeight + 50
} else {
rowHeight = rowHeight + 20
}
// rowHeight is equal to 90
第一个例子使用的三元条件运算符,意味着rowHeight可以在一行代码被设置为正确的值。这比第二个示例更简洁, 不需要课外的rowHeight变量, 因为它的价值不需要在一个if语句中修改。
三元条件运算符提供了一个高效的写法来决定哪个表达式会被执行。不过还是请小心使用三元条件运算符,其简洁性如果过度使用会导致阅读代码的困难。要避免多个实例的三元条件运算符组合成一个复合语句。
范围运算符
Swift包含两个范围运算符,能快捷的表达一系列的值
封闭范围运算符
封闭范围运算符(a…b)定义了一个范围,从a到b,并包括a和b的值。
当要在一个范围内迭代所有可能的值的时候,范围运算符是非常有用的, 例如for-in循环
for index in 1...5 {
println("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
欲了解更多for-in循环,请参阅控制流。
半封闭的区域运算符
半封闭的区域运算符(a..b)定义了从a到b的范围,但不包括b。它被认为是半封闭的,因为它包含第一个值,而不包含最终值。
半封闭的范围使用明确,当你使用从零开始的列表,如数组,它是有用的数到(但不包括)列表的长度:
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in 0..count {
println("Person \(i + 1) is called \(names[i])")
}
// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack
请注意,该数组包含四个项目,但0 . .数只数到3(数组中的最后一个项目的索引),因为它是一个半封闭的范围。欲了解更多有关数组的信息,请参阅数组
逻辑运算符
逻辑运算符修改或结合布尔逻辑值true和false。Swift支持这三个标准逻辑运算符基于c语言:
- Logical NOT (!a)
- Logical AND (a && b)
- Logical OR (a || b)
逻辑非运算符
逻辑非运算符(!a)转化一个Bollean值,true变成false,false变成true。
逻辑操作符是一个前缀操作符, 并立即出现在它修饰的值之前,没有任何空白,它被解读为”不是”, 见下面的例子:
let allowedEntry = false
if !allowedEntry {
println("ACCESS DENIED")
}
// prints "ACCESS DENIED"
这句话if !allowedEntry 能理解为 “if not allowedEntry.” 只执行后续的行,如果“not allowedEntry” 是 true; 那就是说 if allowedEntry是false.
在这个例子中,精心挑选的布尔常量和变量名可以帮助保持代码的可读性和简洁,同时避免双重否定或混乱的逻辑语句。
逻辑与运算符
逻辑与运算符:(A && B)创建的表达式中,A和B两个值必须同时为true时表达式才正确。
其中A或者B有任一值是false时,逻辑与算符表示不成立,必须两者同时为true时才成立。事实上,如果第一个值是false,第二个值甚至不会再进行判断,因为必须是两个值皆为true,已经有一方false、则没必要再往下面进行判断了。这被称作短路条件。
以下这个例子判断两个Bool 类型的值,并只有这两个值都为真的时候会输出:Welcome。失败则输出”ACCESS DENIED”:
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// prints "ACCESS DENIED”
逻辑或运算符
表达式(a || b)运算符中、只要a或者b有一个为true,表达式就成立。
与上面的逻辑与运算符相似,逻辑或运算符使用短路条件判断,如果左边是 true,那么右边不会被判断,因为整体结果不会改变了。
在下面的例子中,第一个布尔值(hasDoorKey)为false,但第二个值(knowsOverridePassword)为true。因为两者有一个值是true,整个表达式的计算结果也为true,正确输出:Welcome!
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// prints "Welcome!"
复合逻辑表达式
你可以将多个逻辑运算符复合来创建更长的复合表达式:
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// prints "Welcome!"
相比于之前两个单独分开的运算符,本次通过多重嵌套、将我们上面的&&、|| 运算符相结合组合成一个较长的复合表达式。看起来有点饶人、其实本质还是两两相比较、可以简单地看成A && B || C || D、从左往右根据运算符优先级进行判断、注意区分开&&、||、只要牢记运算逻辑&&需要两者都为true、||则只需要一方为true则运算符正确即可解析整个复合表达式、透过现象看本质。
明确地括号(翻译成中文语句不连贯太特么饶人了、怒了自己理解。)
复合表达式中,我们可以添加进()使确逻辑意图更加明确,上面的例子中,我们可以在第一部分上加括号来使意义更明确。
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
println("Welcome!")
} else {
println("ACCESS DENIED")
}
// prints "Welcome!"
在复合逻辑表达式中、我们可以使用括号明确地表示我们需要将几个值放在一个单独的逻辑运算中去判断得出结果、最后根据()内的结果再去与后面的值进行判断、看上面的例子、就像我们小学学加减乘除一样、如果没有括号()我们肯定是按照运算符的优先级去判断、但此时有了括号、我们需要先运算其中的逻辑运算符得到它们的值.使用括号()在符合逻辑表达式中可以更明确的你的意图。