四、运算符
1、赋值运算符:
同 C 的部分运算符(如 三目运算符 ?:)
范围运算符: . . < 、 . . .
溢出运算符: &+ 、&- 、&* 、&/ 、&%
赋值: 1对1赋值 、 N对N赋值 let (x, y) = (1, 2) // 元组
与C、OC不一样, Swift的赋值运算符没有返回值
if (x = y) { // 代码错误,因为 x = y 没有返回具体的值,好处:这样防止误用=/==
2、求余运算符:% 求余运算符,也有语言称模运算符
-9 % 4 // -1 -9 % -4 // -1 求余结果的正负跟%左边数值的正负一样
同C不一样:Swift的 % 支持浮点数的计算 8 % 2.5 // 0.5
3、Bool类型:也称逻辑类型(Logical)
取值 true:真、 false:假 (C中:0为假、非0为真,与Swift不同)
if语句的条件值必须为Bool类型: if (12) // 错误写法,括号内返回值必须Bool类型
比较运算符、逻辑运算符返回值是Bool类型:true/false
三目条件运算符的条件必须是Bool类型
4、范围运算符:用来表示一个范围
闭合范围运算符: a ... b, 表示[a,b]包含 a 和 b
半闭合范围运算符:a ..< b, 表示[a,b)包含 a,不包含 b
for i in 0..<5 {
print(i) // 0、1、2、3、4
}
5、溢出运算符:每种数据类型都有自己的取值范围,一旦赋值超出范围会产生编译或运行时错误
let x = Int8.max; let y = x + 1 // y的类型为Int8,超出取值范围,出错
Swift为整形计算提供了5个&开头的溢出运算符,能对超出取值范围的数值进行灵活处理
let y = x &+ 1 // 上溢出:y的类型为Int8,y=-128
除零溢出: let y = x &/ 0 // 或:&% y=0
五、元组类型:元组类型由 N个 任意类型的数据组成,组成元组类型的数据称为“元素”(N>=0)
var position = (m : 10, n : 20) // position有两个元素 m、n是元素名称
let person = (name : "jack") //只有name一个元素 let data = () // 空的元组
元素的访问:用元素的名称:let value = position.m // 取值 position.n = 60 // 设值
用元素的位置:let value = position.0 // 取值 position.1 = 60 // 设值
⚠️如果用 let 来定义一个元组,那么就是常量,就无法修改他的元素。注意m、n的类型,否则设值时会出错
元组的输出:可以输出整个元组来查看所有元素的值
使用细节:可以省略元素名称 let position = (12, "jack")
可以明确指定元素的类型 var person: (Int, String) = (12, "jack”) // 第0个元素只能Int类型,第1个元素只能String类型
⚠️在明确指定元素类型的情况下不能加上元素名称:var person = (age:12, name:"jack”)
可以用多个变量接收元组数据 var (x, y) = (12, 15) var point = (x, y)
可以将元素分别赋值给多个变量 var point = (12, 15) var (x, y) = point
可以使用下划线_,来忽略某个元素的值,取出其他元素的值
var (_, name) = posit // 只有 name = "jack"
六、流程控制
1、for-in:
流程结构:Swift支持流程结构,循环结构:for、for-in、while、do-while
选择结构:if、switch
⚠️这些语句后面一定要跟上大括号{ }
for-in 和 范围运算符
for i in 1...3 {
print(i)
} // 按顺序从范围中取值赋值给i,每去一次值,就执行一次循环体,范围的长度就是循环体的执行次数
如果不需要用到范围中的值,可以使用下划线_ 进行忽略 : for _ in 1...3 // 不使用i
2、Switch:
2.1、基本使用
let grade = “A” switch在C中的区别:
switch grade { 在C中,case的结尾没有break,接着就会执行下一个case
case "A”: 在Swift中,不需要在每个case后面增加break,
print(1) 执行完case对应的代码后,默认会自动退出switch语句
default:
print(0)
}
2.2、使用注意:在switch中,每一个case后面必须有可执行的语句
2.3、多条件匹配和范围匹配
一个case后面可以添加多个匹配条件,条件之间用逗号隔开:case "A","D”:
case后面可以填写一个范围作为匹配条件:case 80…100:
⚠️switch要保证处理所有可能的情况,不然直接报错,因此、这里的default一定要加,不然会出现一些处理不到的情况
2.4、匹配元组:case还可用来匹配元组
let point = (1, 1)
switch point {
case (0, 0):
print("点在原点")
case (_, 0): // _ 的作用:1、能匹配任何值
print("点在x轴上") // 2、忽略对应位置元组元素
case (-2...2, -2...2): // case (0, _): 点在y轴上
print("这个点在矩形框内")
default:
break
}
2.5、数值绑定:在case匹配的同时,可以将switch中的值绑定给一个特定的常量或变量,以便在case后面的语句中使用
let point = (10, 0)
switch point {
case (let x, 0):
print("这个点在x轴上,\(x)")
case (0, let y):
print("这个点在y轴上,\(y)")
case let (x, y):
print("这个点在x轴位置\(x),点在y轴位置\(y)")
} // 这个点在 x 轴上,值为 10
2.6、where:switch语句可以使用where来增加判断条件
var point = (10, 10) // 判断一个点是否在紫线&绿线上
switch point {
case let (x, y) where x == y :
print("在绿线上")
case let (x, y) where x == -y :
print("在紫线上")
default :
print("不在线上")
} // 在绿线上
2.7、fallthrough:作用-执行完当前case后,会接着执行fallthrough后面的case或default的语句
let num = 20 // ⚠️:fallthrough后面的case条件不能定义变量和常量
var str = "\(num)是个"
switch num {
case 0...50 :
str += "0 到 50之间"
fallthrough // 继续执行default的语句,类似C中去break的
default :
str += "的数"
} // 20是个0 到 50之间的数
3、标签:
使用标签的其中一个作用:可以用于明确指定要退出哪个循环体:
Group: for _ in 1...3 { // 添加🏷️:Group
for item in 1...5 {
print("hard working")
if item == 3 { // 运行3次,跳出
break Group
}
}
print("have rest")
}