Appearance
Swift 入门(9):结构体与类
Swift 中既有 结构体(struct),也有 类(class)。两者非常相似,但也有重要区别。
定义结构体
swift
struct Point {
var x: Int
var y: Int
}
var p1 = Point(x: 3, y: 5)
p1.x = 10
print(p1) // Point(x: 10, y: 5)结构体自动拥有一个 成员初始化器,不需要手动写构造函数。
定义类
swift
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let p = Person(name: "Tom", age: 20)
print(p.name) // Tom类需要写 init 构造函数来初始化属性。
值类型 vs 引用类型
这是两者最大的区别:
- 结构体 是 值类型,赋值时会复制一份。
- 类 是 引用类型,赋值时多个变量指向同一个对象。
swift
var a = Point(x: 1, y: 2)
var b = a
b.x = 100
print(a.x) // 1(不受影响)
let p2 = p
p2.name = "Jerry"
print(p.name) // Jerry(引用同一个对象)选择结构体还是类?
- 结构体:推荐默认使用,轻量、安全,常用于数据模型。
- 类:当需要继承、引用语义时使用(如视图控制器)。
类的高级用法
继承与协议实现
swift
// 继承系统类并实现协议的语法
class PasskeysNative: NSObject, ASAuthorizationControllerDelegate {
// 类的内容
}语法结构:class 类名: 父类, 协议1, 协议2, ...
为什么继承 NSObject?
swift
// ✅ 继承 NSObject 的好处
class MyClass: NSObject {
// 1. 与 Objective-C 兼容
// 2. 支持 @objc 标记的方法
// 3. 可以被跨语言框架调用
// 4. 支持 KVO、KVC 等特性
}
// ❌ 纯 Swift 类的限制
class PureSwiftClass {
// 无法直接与 Objective-C 交互
}实现协议方法
swift
class AuthHandler: NSObject, SomeProtocol {
// 实现协议要求的方法
func requiredMethod() {
print("实现协议方法")
}
}小结
struct= 值类型,复制独立。class= 引用类型,共享同一对象。- 类可以继承父类并实现多个协议。
- 继承
NSObject提供 Objective-C 兼容性。 - Swift 鼓励多用结构体,少用类,除非需要继承。