常量和变量
常量和变量将名称(例如name,age)与特定类型的值(例如String的"jf",number 10)相关联。常量的值一旦设置就不能改变,而变量可以在将来设置不同的值。
-
声明常量和变量
// swift中一行只有一条语句时,末尾可以不写;
let a: Int = 10
// 可以通过Option + 鼠标左键来查看变量的类型
let b: Double = 2.44
// swift是强类型语言,只能给变量赋值同一类型的值
var num: Int = 10
num = 2.4 // 报错 Cannot assign value of type 'Double' to type 'Int'
// 一行声明多个常量/变量时,中间用,隔开
let x: Double = 1.0, y: Double = 2.0, z: Double = 3.0
var num1: Int = 1, num2: Int = 20, num3: Int = 30
// 类型推导
let a = 10 // 类型推导为Int
let b = 2.44 // 类型推导为Double,swift中默认浮点型为Double
-
常量使用注意
// 常量的指向不能改变,但是可以通过指针修改所指向的对象属性
let topView = UIView()
topView.backgroundColor = UIColor.red
topView.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
view.addSubView(topView)
-
命名常量和变量的规则和规范
3.1 常量和变量名几乎可以包含任何字符,包括Unicode字符:
// 正确写法
let π = 3.14159
let 你好 = "你好世界"
let 🐶🐮 = "dogcow"
3.2 常量和变量名称不能包含:
- 空白字符
- 数学符号
- 箭头
- 专用Unicode标量值
- 线条
- 方框图字符
- 不能以数字开头
// 错误写法
let s um = 10
let s+um = 10
let s->um = 10
let 10sum = 10
let s-sum = 10
let s♦️sum = 10
3.3 一旦你声明了一个特定类型的常量或变量,你就不能用相同的名字再次声明它,或者改变它来存储不同类型的值。如果您需要为常量或变量指定与保留的 Swift 关键字相同的名称,请`在将其用作名称时用反引号将关键字括起来。除非您别无选择,否则请避免使用关键字作为名称。
let `var` = 10 // 不推荐这样做
-
常量和变量的打印
swift中使用print(_:separator:terminator:):打印变量或常量
let name = "jf"
print(name) // jf
var age = 10
print(age) // 10
print("年龄:",age) // 年龄: 10
注释
使用注释在代码中包含不可执行的文本,作为对自己的注释或提醒。编译代码时,Swift编译器会忽略注释
- 单行注释以两个正斜杠(//)开头,与C语言注释非常相似
// This is a comment
- 多行注释以正斜杠后跟星号(/*)开头,以星号后跟正斜杠(*/)结束:
/* This is also a comment
but is written over multiple lines. */
- swift中的多行注释可以嵌套其他多行注释
/* This is the start of the first multiline comment.
/* This is the second, nested multiline comment. */
This is the end of the first multiline comment. */
- MARK,TODO,FIXME,warning
// MARK: 类似于OC中的#pragma mark
// MARK: - 类似于OC中的#pragma mark -
// TODO: 用于标记未完成的任务
// FIXME: 用于标记待修复的问题
// #warning("待完成")
基本运算符
- 赋值运算符
let b = 10
var a = 5
a = b // a is now equal 10
//如果赋值的右边是一个有多个值的元组,他的元素可以一次分解成多个常量或变量:
let (x, y) = (1, 2)
//与C和Objective-C中的赋值运算符不同,Swift中的赋值运算符本身并不返回值。以下代码无效
if x = y {
// This isn't valid, because x = y doesn't return a value
}
- 算数运算符 Swift支持所有数字类型的四种标准算数运算符和取模运算:
- 加法(+)
- 减法(-)
- 乘法(*)
- 除法(/)
- 取模(%)
1 + 2
5 - 3
2 * 3
10.0 / 2.5
10 % 2
与C和Objective-C中的运算符不同,Swift算术运算符默认情况下不允许溢出。你可以通过使用Swift的一处运算符来选择值溢出行为. a &+ b,关于溢出运算符更多知识参考官方文档 溢出运算符
- 一元运算符
- 3.1 一元减号运算符 可以使用前缀来切换数值的符号-,称为一元减运算符:
let three = 3
let minusThree = -three
let plusThree = -minusThree
一元减号运算符(-)直接附加在它所操作的值之前,没有任何空格。
- 3.2 一元加号运算符 一元加号运算符(+)只返回它所操作的值,没有任何更改:
let minusSix = -6
let alsoMinusSix = +minusSix
虽然一元加号运算符实际上并没有做任何事情,但你可以使用它在代码中未正数提供对称性,同时也将一元减号运算符用于负数。
4.复合赋值运算符 与C一样,Swift提供了将赋值与另一个操作结合起来的复合赋值运算符。例如加法赋值运算符(+=):
var a = 1
a += 2 // 等价于 a = a + 2
a -= 2
a *= 2
a /= 2
a %= 2
print(a)
5.比较运算符
- 5.1 swift中支持以下比较运算符:
- 等于()a == b
- 不等于()a != b
- 大于()a > b
- 小于()a < b
- 大于或等于()a >= b
- 小于或等于()a <= b
1 == 1 // true
2 != 1 // true
2 > 1 // true
1 < 2 // true
1 >= 1 // true
2 <= 1 // false
- 5.2 比较运算符常用于条件语句中,例如if语句:
let name = "world"
if name == "world" {
print("hello,world")
} else {
print("I'm sorry \(name),but I don't recognize you")
}
// Prints "hello, world",because name is indeed equal to "world".
- 5.3 swift中的元组也是可以进行比较的,规则是: 比较元组的第一个元素,如果不相等则返回第一个元素的比较结果;如果第一个元素相等,则比较第二个元素,当所有元素的都相等,则元组相等
(1,"zebra") < (2, "apple") // true,1 < 2,元组后面的元素不需要继续比较了
(3,"apple") < (3,"bird") // true,3 == 3,apple 小于 bird所以,前面的元组小于后面的元组
(4,"dog") == (4,"dog") // true,元组中的元素都相等,所以元组相等
6.三目元算符 swift中的三目运算符和C和Objective-C中的用法一致
let m = 10
let n = 20
// 取m,n中最大的数
let result = m > n ? m : n
7.零合并运算符(??)
// 需求:当用户设置了颜色时,使用用户设置的颜色,如果用户没有设置颜色,则使用默认的颜色
let defaultColor = "red"
var userDefinedColor: String?
var colorNameToUse = userDefinedColor ?? defaultColor
print(colorNameToUse) // "red",userDefinedColor为nil,所以取defaultColor的值
userDefinedColor = "green"
colorNameToUse = userDefinedColor ?? defaultColor
print(colorNameToUse) // "green",userDefinedColor不为nil,取userDefinedColor的值
8.范围运算符 Swift包含几个范围运算符,他们是表示范围的快捷方式.
- 8.1 封闭范围运算符 a...b定义从a到范围b,并包括a和b,a的值不得大于b.
for index in 1...5 {
print("\(index)times 5 is \(index * 5)")
}
- 8.2 半开范围运算符 a..<b定义从a到b但不包括范围b,之所以说它是半开范围;是因为它包含它的第一个值,但不包含它的最终值. 与封闭范围运算符一样,a的值不大于b,如果a的值等于b,则结果将为空
let names = ["Anna","Alex","Brian","Jack"]
let count = names.count
for i in 0..<coumt {
print("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
- 8.3 单面范围 在某些情况下,可以省略范围运算符一侧的值.这种范围称为单边范围,因为运算符仅在一侧有值.
for name in names[2...] {
print(name)
}
// Brian
// Jack
for name in names[...2] {
print(name)
}
// Anna
// Alex
// Brian
半开范围运算符也有一个单边形式,只写有它的最终值.例如:
for name in names[..<2] {
print(name)
}
// Anna
// Alex
let range = ...5
range.contains(7) // false
range.contains(4) // true
range.contains(-1) // true
9.逻辑运算符
- 逻辑非 !a
- 逻辑与 a && b
- 逻辑或 a || b