Swift 基础语法核心概念解析
结构体与类的区别
在 Swift 中,结构体(struct)和类(class)都可以定义属性、方法以及初始化器。然而两者在行为上有关键差异:
- 值类型 vs 引用类型:结构体是值类型,赋值或传递时会进行拷贝;类是引用类型,多个变量可指向同一实例。
- 继承支持:只有类支持继承,结构体不能从其他类型继承,也不能被继承。
- 使用场景建议:若数据模型不需要继承、类型转换或多态特性,优先使用结构体以提升性能和安全性。
协议的设计与实现
协议(protocol)用于定义一组方法、属性或其他需求的契约,不提供具体实现。任何类型(类、结构体、枚举)只要满足这些要求即可遵循该协议。
protocol Configurable {
var description: String { get }
mutating func update()
}
上述代码中,{ get } 表示只读属性;而 mutating 关键字允许值类型在方法内部修改自身状态。
例如一个结构体实现该协议:
struct Settings: Configurable {
var version: Int
var description: String {
return "Configuration v\(version)"
}
mutating func update() {
version += 1
}
}
可选类型与条件绑定
Swift 使用可选类型(Optional)处理可能缺失的值。通过 if let 进行安全解包,并结合 where 子句添加额外判断条件。
var userName: String? = "Alice"
var welcomeMessage = "Hi"
if let name = userName, name.hasPrefix("A") {
welcomeMessage = "Welcome, \(name)"
}
print(welcomeMessage)
控制流与模式匹配
Swift 的 switch 支持强大的模式匹配功能,包括值绑定和条件过滤。
let food = "green pepper"
var comment = ""
switch food {
case "carrot":
comment = "Great for vision."
case "cucumber", "lettuce":
comment = "Perfect in salads."
case let x where x.contains("pepper"):
comment = "Spicy? Maybe not always."
default:
comment = "Try it in a stew."
}
print(comment)
循环与范围操作符
使用半开区间(..<)和闭区间(...)简化循环逻辑。
var sum = 0
for i in 0..<4 {
sum += i
}
print(sum) // 输出 6
var count = 0
for _ in 1...5 {
count += 1
}
print(count) // 输出 5</code>
面向对象编程示例
定义基类并实现继承与多态:
class Shape {
var sides: Int = 0
func describe() -> String {
return "A shape with \(sides) sides"
}
}
class Rectangle: Shape {
var width: Double
var height: Double
init(width: Double, height: Double) {
self.width = width
self.height = height
super.init()
sides = 4
}
func area() -> Double {
return width * height
}
override func describe() -> String {
return "A rectangle of \(width)x\(height)"
}
}
枚举与关联行为
枚举可以包含计算属性和方法,增强其表达能力。
enum Rank: Int {
case ace = 1, two, three, four, five, six, seven, eight, nine, ten
case jack, queen, king
func label() -> String {
switch self {
case .ace: return "Ace"
case .jack: return "Jack"
case .queen: return "Queen"
case .king: return "King"
default: return "\(rawValue)"
}
}
}
let cardRank = Rank.five
print(cardRank.label()) // 输出 5
类型检查与向下转型
利用 as? 操作符在运行时判断对象实际类型。
let shapes: [Shape] = [
Rectangle(width: 2.0, height: 3.0),
Rectangle(width: 1.5, height: 1.5)
]
var rectCount = 0
for item in shapes {
if let _ = item as? Rectangle {
rectCount += 1
}
}
print("Found \(rectCount) rectangles")