本篇目标

掌握 Swift 中变量与常量的声明方式,理解基本数据类型,学会类型推断与类型注解,能正确选择 var 与 let。

一、变量与常量

Swift 用 var 声明变量,用 let 声明常量。

var name = "Swift"       // 变量,可以修改
let version = 5.9        // 常量,不可修改

变量:值可以改变。

var count = 0
count = 1
count = 2
print(count)  // 输出 2

常量:值一旦赋值,不能修改。

let pi = 3.14159
// pi = 3.14  // 报错:Cannot assign to value: 'pi' is a 'let' constant

选择原则:

  • 默认用 let,除非确定需要修改。

  • 需要修改时用 var。

  • 编译器会提示不必要的 var。

二、类型推断与类型注解

类型推断:Swift 会根据初始值自动推断类型。

let name = "Swift"       // 推断为 String
let year = 2014          // 推断为 Int
let price = 9.99         // 推断为 Double
let isOpen = true        // 推断为 Bool

类型注解:显式声明类型。

let name: String = "Swift"
let year: Int = 2014
let price: Double = 9.99
let isOpen: Bool = true

什么时候用类型注解:

  • 初始值无法推断类型时

  • 想明确类型时

  • 声明时不赋值,稍后赋值时

var score: Int
score = 100

三、基本数据类型

整数 Int

let age: Int = 30
let count: Int = -5
let maxInt: Int = Int.max
let minInt: Int = Int.min

不同位数的整数:

let a: Int8 = 127
let b: Int16 = 32767
let c: Int32 = 2147483647
let d: Int64 = 9223372036854775807

进制表示:

let decimal = 17         // 十进制
let binary = 0b10001     // 二进制
let octal = 0o21         // 八进制
let hex = 0x11           // 十六进制

数字分隔符(提高可读性):

let bigNumber = 1_000_000
let phone = 138_0000_0000

浮点数 Double 与 Float

let pi: Double = 3.14159
let rate: Float = 0.5
  • Double:64 位,精度高,默认浮点类型

  • Float:32 位,精度低,占用小

let a = 3.14        // 默认推断为 Double
let b: Float = 3.14 // 显式声明 Float

布尔 Bool

let isTrue: Bool = true
let isFalse: Bool = false

字符串 String

let name: String = "Swift"
let greeting = "Hello, \(name)!"   // 字符串插值

多行字符串:

let text = """
这是第一行
这是第二行
这是第三行
"""

字符串常用操作:

let str = "Hello"
print(str.count)            // 5
print(str.isEmpty)          // false
print(str.uppercased())     // HELLO
print(str.lowercased())     // hello
print(str.hasPrefix("He"))  // true
print(str.hasSuffix("lo"))  // true

字符 Character

let letter: Character = "A"

四、类型转换

Swift 是强类型语言,不同类型不能直接运算。

整数与浮点数转换:

let intValue = 10
let doubleValue = 3.14

let result = Double(intValue) + doubleValue  // 13.14
let result2 = intValue + Int(doubleValue)    // 13

字符串与数字转换:

let str = "123"
let num = Int(str)       // Optional(123)
let num2 = Int("abc")    // nil

let number = 456
let str2 = String(number)  // "456"

注意:

  • Int("abc") 返回可选类型,可能为 nil

  • 转换可能失败,需要用可选类型处理

五、类型别名

用 typealias 给类型起别名:

typealias UserID = Int

let id: UserID = 1001

用途:

  • 让代码语义更清晰

  • 简化复杂类型

typealias Completion = (Bool, String) -> Void

六、元组 Tuple

元组可以把多个值组合成一个复合值。

let person = ("Tom", 25)
let person2 = (name: "Tom", age: 25)

访问元组元素:

let person = (name: "Tom", age: 25)
print(person.name)   // Tom
print(person.age)    // 25

let (name, age) = person
print(name)          // Tom
print(age)           // 25

用途:

  • 函数返回多个值

  • 临时组合数据

七、避坑指南

  • 默认用 let:只有需要修改时才用 var。

  • 类型推断不等于弱类型:Swift 仍然是强类型语言。

  • 整数溢出:使用 &+ 等溢出运算符,或用更大类型。

  • 浮点数精度:涉及金钱计算建议用 Decimal。

  • 字符串索引:Swift 字符串不能用整数下标,需要用 String.Index。

  • 可选类型:转换可能失败时返回可选类型,不要强行解包。

  • 字符串插值必须用半角括号:\(值) 的右括号必须是英文 ),写成中文全角 )会让编译器认为字符串没有结束,直接报 Unterminated string literal。中文输入法下极易踩到,而且报错位置往往指不出真正原因。

八、检查清单

  • [ ] 能区分 var 与 let

  • [ ] 能使用类型推断与类型注解

  • [ ] 掌握 Int、Double、Bool、String 基本用法

  • [ ] 能进行类型转换

  • [ ] 会使用 typealias

  • [ ] 了解元组的用法