Skip to content

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 鼓励多用结构体,少用类,除非需要继承。

本站总访问