在编程的世界中,每一种新语言的学习之旅都以一个简单的问候开始,通常就是“Hello, world!”。Swift 语言也不例外。只需一行代码:
print("Hello, world!")
这行代码不仅是 Swift 语言的入门,更是它强大简洁语法的缩影。在 Swift 中,无需导入额外库即可实现文本输出,程序的入口点直接由全局作用域的代码决定,这意味着你不再需要像 C 语言那样写一个 main()
函数。此外,Swift 还省略了每条语句后的分号,使得代码更加清晰易读。
🔍 基础概念:常量与变量
在 Swift 中,使用 let
定义常量,用 var
定义变量。常量的值在编译时不必知道,但必须赋值一次。这样的设计使得常量可以用来命名一个只需确定一次的值,而在多个地方使用。
var myVariable = 42
myVariable = 50
let myConstant = 42
值得注意的是,常量或变量的类型必须与赋值的值一致。Swift 的编译器能根据初始值推断变量类型。例如,上述代码中,myVariable
被推断为整型。如果初始值无法提供足够的信息,或没有初始值,则需要显式指定类型。
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70
🧪 实验:创建常量
试着创建一个明确类型为 Float
且值为 4 的常量。
Swift 中,值不会被隐式转换为另一种类型。如果需要转换,则必须显式创建目标类型的实例。例如:
let label = "The width is "
let width = 94
let widthLabel = label + String(width)
如果你尝试移除最后一行中的转换,Swift 会报错。
🍏 字符串插值
在字符串中插入值更简单的方法是使用 \(value)
,例如:
let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."
如果需要多行字符串,可以使用三重引号("""
),Swift 会自动移除开头和结尾相同缩进的空格。
let quotation = """
Even though there's whitespace to the left,
the actual lines aren't indented.
Except for this line.
"""
📦 数组与字典
Swift 中的数组和字典使用方括号([]
)创建,并通过索引或键来访问元素。创建空数组或字典时,可以直接使用 []
或 [:]
。
var fruits = ["strawberries", "limes", "tangerines"]
fruits[1] = "grapes"
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"
数组会随着元素的增加而自动增长。
fruits.append("blueberries")
print(fruits)
// Prints "["strawberries", "grapes", "tangerines", "blueberries"]"
🔄 控制流
Swift 使用 if
和 switch
来进行条件判断,使用 for-in
、while
和 repeat-while
来进行循环。条件或循环变量的括号是可选的,但代码块的花括号是必须的。
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
print(teamScore)
// Prints "11"
在 if
语句中,条件必须是布尔表达式,这意味着像 if score { ... }
这样的代码是错误的。
🎉 使用条件选择
你可以在赋值或返回语句中使用 if
或 switch
来选择值。例如:
let scoreDecoration = if teamScore > 10 {
"🎉"
} else {
""
}
print("Score:", teamScore, scoreDecoration)
// Prints "Score: 11 🎉"
🛠️ 函数与闭包
使用 func
声明函数,并通过参数列表调用函数。返回类型用 ->
分隔。
func greet(person: String, day: String) -> String {
return "Hello \(person), today is \(day)."
}
greet(person: "Bob", day: "Tuesday")
🧩 使用元组返回多个值
你可以使用元组创建复合值。例如,返回多个值:
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
var min = scores[0]
var max = scores[0]
var sum = 0
for score in scores {
if score > max {
max = score
} else if score < min {
min = score
}
sum += score
}
return (min, max, sum)
}
let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
print(statistics.sum) // Prints "120"
🏗️ 对象与类
使用 class
创建类,类中的属性声明与常量或变量声明相同。方法和函数的声明也是如此。
class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shape with \(numberOfSides) sides."
}
}
创建类的实例,只需在类名后加括号。
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
🏆 继承与重写
子类在类名后加上超类名,用冒号分隔。重写的方法用 override
标记。
class Square: NamedShape {
var sideLength: Double
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 4
}
func area() -> Double {
return sideLength * sideLength
}
override func simpleDescription() -> String {
return "A square with sides of length \(sideLength)."
}
}
🎨 枚举和结构体
使用 enum
创建枚举,枚举可以有与之相关联的方法。
enum Rank: Int {
case ace = 1
case two, three, four, five, six, seven, eight, nine, ten
case jack, queen, king
func simpleDescription() -> String {
switch self {
case .ace:
return "ace"
case .jack:
return "jack"
case .queen:
return "queen"
case .king:
return "king"
default:
return String(self.rawValue)
}
}
}
📝 结构体的定义
使用 struct
创建结构体,结构体拥有与类相似的行为。
struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -> String {
return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
}
}
⚛️ 并发编程
使用 async
标记异步函数,调用异步函数时需在前面加上 await
。
func fetchUserID(from server: String) async -> Int {
if server == "primary" {
return 97
}
return 501
}
🧩 使用任务组
使用 Task
从同步代码调用异步函数,而不等待它们返回。
Task {
await connectUser(to: "primary")
}
📜 协议与扩展
使用 protocol
声明协议。类、枚举和结构体都可以采用协议。
protocol ExampleProtocol {
var simpleDescription: String { get }
mutating func adjust()
}
🔧 使用扩展增加功能
通过 extension
为现有类型添加功能,例如新方法和计算属性。
extension Int: ExampleProtocol {
var simpleDescription: String {
return "The number \(self)"
}
mutating func adjust() {
self += 42
}
}
💥 错误处理
使用 enum
表示错误类型,使用 throw
抛出错误,使用 do-catch
处理错误。
enum PrinterError: Error {
case outOfPaper
case noToner
case onFire
}
🔑 泛型
通过在尖括号中写名称来创建泛型函数或类型。
func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
var result: [Item] = []
for _ in 0..<numberOfTimes {
result.append(item)
}
return result
}
结语
Swift 语言如同一把锋利的工具,让开发者能以优雅的方式解决复杂问题。在这一场编程的旅程中,Swift 以其简洁、高效和安全的特性,成为了现代开发者的得力助手。
参考文献
- Apple. Swift Programming Language. https://swift.org/documentation/
- Apple. The Swift Language Guide. https://docs.swift.org/swift-book/
- Hacking with Swift. Swift Programming Language. https://www.hackingwithswift.com/
- Ray Wenderlich. Swift Tutorial for Beginners. https://www.raywenderlich.com/
- Paul Hudson. 100 Days of Swift. https://www.hackingwithswift.com/100/swiftui
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于