《swift2.0 官方教程中文版》 第2章-02基本运算符

import Foundation



/*术语***********************************************/




/*赋值运算符***********************************************/

//赋值运算( a = b ),表示用 b 的值来初始化或更新 a 的值:

let b = 10

var a = 5

a = b

// a 现在等于 10


//如果赋值的右边是一个多元组,它的元素可以马上被分解成多个常量或变量:

let (x,y) = (1,2)

// 现在 x 等于 1,y 等于 2


// C 语言和 Objective-C 不同,Swift 的赋值操作并不返回任何值。所以以下代码错误:

//if x = y {

// // 此句错误,因为 x = y 并不返回任何值

//}




/*算术运算符***********************************************/

// C 语言和 Objective-C 不同的是,Swift 默认情况下不允许在数值运算中出现溢出情况。但是你可以使用 Swift 的溢出运算符来实现溢出运算( a &+ b )。详情参见溢出运算符 ( 0)

//加法运算符也可用于 String 的拼接: "hello," + "world" // 等于 "hello,world"

let c = "hello,"+"world"

print(c)


//在对负数 b 求余时,b 的符号会被忽略。这意味着 a % b a % -b 的结果是相同的。

//不同于 C 语言和 Objective-C,Swift 中是可以对浮点数进行求余的。

let d = 8 % 2.5 // 等于 0.5

print(d)


// ++ 前置的时候,先自増再返回。

// ++ 后置的时候,先返回再自增。

//例如:

var a1 = 0

let b1 = ++a1 // a1 b1 现在都是 1

let c1 = a1++ // a1 现在 2, c1 a1 自增前的值 1


//除非你需要使用 i++ 的特性,不然推荐你使用 ++i --i,因为先修改后返回这样的行为更符合我们的逻辑。




/*复合赋值***********************************************/

//复合赋值运算没有返回值,let b = a += 2 这类代码错误。这不同于上面提到的自增和自减运算符。




/*比较运算符***********************************************/

1 == 1 // true,因为 1 等于 1

2 != 1 // true,因为 2 不等于 1

2 > 1 // true,因为 2 大于 1

1 < 2 // true,因为 1 小于2

1 >= 1 // true,因为 1 大于等于 1

2 <= 1 // false,因为 2 并不小于等于 1




/*三目运算符***********************************************/

//这里有个计算表格行高的例子。如果有表头,那行高应比内容高度要高出50;如果没有表头,只需高出20:

let contentHeight = 40

let hasHeader = true

let rowHeight = contentHeight + (hasHeader ? 50 : 20) // rowHeight 现在是 90




/*空合运算符***********************************************/

//空合运算符( a ?? b )将对可选类型 a 进行空判断,如果 a 包含一个值就进行解封,否则就返回一个默认值 b .这个运算符有两个条件:

//? 表达式 a 必须是Optional类型

//? 默认值 b 的类型必须要和 a 存储值的类型保持一致


//下文例子采用空合并运算符,实现了在默认颜色名和可选自定义颜色名之间抉择:

let defaultColorName = "red"

var userDefinedColorName: String? //默认值为 nil

var colorNameToUse = userDefinedColorName ?? defaultColorName

// userDefinedColorName 的值为空,所以 colorNameToUse 的值为 "red"

// 即如下表达式的简写

//var colorNameToUse = userDefinedColorName != nil ? userDefinedColorName! : defaultColorName

print(colorNameToUse)


//另一种情况,分配一个非空值( non-nil ) userDefinedColorName,再次执行空合运算,运算结果为封包在 serDefaultColorName 中的值,而非默认值。

userDefinedColorName = "green"

colorNameToUse = userDefinedColorName ?? defaultColorName

print(colorNameToUse)

// userDefinedColorName 非空,因此 colorNameToUse 的值为 "green"




/*区间运算符***********************************************/

//闭区间运算符( a...b )定义一个包含从 a b (包括 a b )的所有值的区间,b 必须大于等于 a ? 闭区 间运算符在迭代一个区间的所有值时是非常有用的,如在 for-in 循环中:

for index in 1...5 {

print("\(index) * 5 = \(index * 5)")

}

//半开区间( a..<b )定义一个从 a b 但不包括 b 的区间。 之所以称为半开区间,是因为该区间包含第一个值 而不包括最后的值。

for index in 1..<5 {

print("\(index) * 5 = \(index * 5)")

}

let j = 10

let j2 = 20

for index in j..<j2 {

print("====\(index) * 5 = \(index * 5)")

}


//半开区间的实用性在于当你使用一个从0开始的列表(如数组),非常方便地从0数到列表的长度。

let names = ["Anna","Alex","Brian","Jack"]

for i in 0..<names.count {

print(" \(i + 1) 个人叫 \(names[i])")

}




/*逻辑运算***********************************************/

//逻辑非运算( !a )对一个布尔值取反,使得 true false,false true

//它是一个前置运算符,需紧跟在操作数之前,且不加空格。读作 a,例子如下:

let allowedEntry = false

if !allowedEntry {

print("ACCESS DENIED")

}

// 输出 "ACCESS DENIED"


//逻辑与(a && b)表达了只有 a b 的值都为 true ,整个表达式的值才会是 true

//只要任意一个值为 false,整个表达式的值就为 false 。事实上,如果第一个值为 false,那么是不去计算第二 个值的,因为它已经不可能影响整个表达式的结果了。这被称做短路计算

let enteredDoorCode = true

let passedRetinaScan = false

if enteredDoorCode && passedRetinaScan {

print("Welcome!")

} else {

print("ACCESS DENIED")

}

// 输出 "ACCESS DENIED"


//逻辑或( a || b )是一个由两个连续的 | 组成的中置运算符。它表示了两个逻辑表达式的其中一个为 true,整个 表达式就为 true

//同逻辑与运算类似,逻辑或也是短路计算,当左端的表达式为 true ,将不计算右边的表达式了,因为它 不可能改变整个表达式的值了。

let hasDoorKey = false

let knowsOverridePassword = true

if (hasDoorKey || knowsOverridePassword) {

print("Welcome!")

} else {

print("ACCESS DENIED")

}

// 输出 "Welcome!"


// Swift 逻辑操作符 && || 是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的 子表达式。

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword { print("Welcome!")

} else {

print("ACCESS DENIED")

}

// 输出 "Welcome!"

//如果我们输入了正确的密码并通过了视网膜扫描,或者我们有一把有效的钥匙,又或者我们知道紧急情况下重置的密码,我们就能把门打开进入。


if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword { print("Welcome!")

} else {

print("ACCESS DENIED")

}

// 输出 "Welcome!"

相关文章

Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章。自从苹果发布 Swfit 编程语言,就成为了...
快,快,快!动动您的小手,分享给更多朋友! 苹果去年推出了全新的编程语言Swift,试图让iOS开发更简单...
开发者(KaiFaX) 面向开发者、程序员的专业平台! 和今年年初承诺的一样,苹果贴出了Swift语言的源码,...
本文由@Chun发表于Chun Tips :http://chun.tips/blog/2014/12/11/shi-yong-swift-gou-jian-zi-ding-yi...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...