Skip to content

结构体和类 ​

实现状态: struct / class / data class / actor / enum 已实现(含 final class Phase 60、data class Phase 50–52 证明宏);继承与多态 GA(Phase 51–55 + Phase 66 vtable)

SYX 提供五种类型声明:struct(值)、class(引用)、data class(不可变记录)、actor(并发隔离)、enum(ADT,已见 第 9 章)。本章讲清「何时用哪个」以及内存语义。

struct ​

值类型字段聚合。Phase 70+ 起值语义逐步 GA(早期 MVP):

swift
struct Point {
    var x: Int
    var y: Int
}

func main() {
    let p = Point(x: 1, y: 2)
    print(p.x)                             // 1
    print(p.y)                             // 2
}
特性状态
字段 var / let已实现
构造(按字段顺序)已实现:Point(1, 2)
mutating func部分实现(Phase 60 起基本可用)
值类型完整拷贝部分实现(深拷贝边界演进中)
Codable 合成通过 @Codable 宏(data class 优先)
swift
struct Counter {
    var value: Int = 0
    mutating func increment() { value = value + 1 }
}

var c = Counter()
c.increment()
print(c.value)                             // 1

mutating: 标记会修改 self 的方法;调用方必须用 var(不能 let)。无标记的 mutating 方法在 let 上调用 → S020。

值语义:struct 赋值拷贝(R-38 · SEM-STRUCT) ​

赋值 struct 会拷贝;改副本不得改原值:

swift,output
// prints: 1\n9
struct Point {
    var x: Int
}

func main() {
    var p = Point(x: 1)
    var q = p
    q.x = 9
    print(p.x)
    print(q.x)
}

class ​

引用类型对象。SYX class 是 ARC 引用计数 + class ObjectRef(Phase 73 起):

swift
class Greeter {
    var name: String

    init(name: String) {
        self.name = name
    }

    func hello() {
        print("Hello, \(self.name)")
    }
}

func main() {
    let g = Greeter(name: "World")
    g.hello()                               // "Hello, World"

    let g2 = g                              // 共享引用
    g2.name = "SYX"
    print(g.name)                           // "SYX"(同一对象)
}
特性状态
字段 var / let已实现
init已实现(见 第 15 章)
deinit部分实现(class ARC 归零触发,Phase 102/103)
继承GA(Phase 51–55 + Phase 66 vtable)
overrideGA(多态分派)
引用语义已实现

来源:crates/syx-driver/tests/fixtures/parity/inheritance_dispatch.sy

final class ​

Phase 60 起 final class 用于禁止子类化的封闭类型:

swift
final class Token {
    let value: String
    init(value: String) { self.value = value }
}
  • final 禁止子类化
  • final 允许编译器做 devirtualization(静态调用)
  • ADT 变体族请用 enum(switch exhaustiveness MVP)

data class ​

不可变记录的声明式语法。Phase 50–52 证明宏 在 stored 属性 data class 上自动合成 == / hash / encode / decode:

swift
@Equatable
@Hashable
@Codable
data class Point(x: Int, y: Int)

func main() {
    let p1 = Point(x: 1, y: 2)
    let p2 = Point(x: 1, y: 2)
    print(p1 == p2)                        // true
    print(p1.description())                // "Point(x: 1, y: 2)"

    let json = p1.encode()                 // "{\"x\":1,\"y\":2}"
    let back = Point.decode(text: json)
    print(back == p1)                      // true
}
能力状态
自动构造已实现(字段顺序)
自动 description()已实现("Type(field: value, ...)")
@Equatable 合成 ==GA(L1 stored data class)
@Hashable 合成 hash(into:)GA(L1)
@Codable 合成 encode/decodeGA(L1 stored);L2 关联值 enum 全自动
Swift 式自动 copy未实现
Hashable Hashable L2 generic未实现

不带宏也能用: 不写 @Equatable / @Hashable / @Codable 仍有 description();写宏会追加 witness。

无 Swift 式自动 copy(未实现);当前用显式构造 / with:

swift
struct Point {
    var x: Int
    var y: Int
}

func with(_ p: Point, x: Int) -> Point {
    return Point(x: x, y: p.y)
}

ADT 变体族 ​

封闭代数数据类型请用 enum(不是 sealed 关键字——lexer 无此关键字):

swift
enum Result<T, E> {
    case ok(T)
    case err(E)
}

历史: Phase 50 之前文档曾描述 sealed class;当前 lexer 不接受 sealed。ADT 用 enum;禁止子类化用 final class。

actor ​

并发隔离对象(详见 第 18 章):

swift
actor Counter {
    var value: Int = 0
    func increment() { self.value = self.value + 1 }
    func current() -> Int { return self.value }
}

let c = Counter()
await c.increment()                       // 必须 await
print(await c.current())                  // 1
  • actor 状态对外隔离
  • 跨 actor 访问须 await
  • 隔离违规 → A002 / C001

选择指南 ​

场景选理由
简单数据载体、需 == / Hashabledata class自动合成、最少代码
需要共享可变状态、引用语义classARC、引用相等
并发安全的状态actor隔离、避免锁
值类型、栈分配、性能敏感struct零堆分配
封闭变体族(ADT)enumexhaustiveness + 模式匹配
表达错误、状态机enumResult / Optional / Status

内存语义对比 ​

类型内存拷贝共享
struct栈 / 内嵌值拷贝(部分实现)不共享
class堆(ARC)引用赋值(共享)共享
actor堆(隔离)引用隔离队列
data class堆(值语义)引用(不可变推荐)引用
enum栈 / 堆(按 case)视 case视 case

完整示例 ​

swift
@Equatable
data class User(name: String, age: Int)

class Account {
    let owner: User
    var balance: Int

    init(owner: User, balance: Int) {
        self.owner = owner
        self.balance = balance
    }

    func deposit(_ amount: Int) {
        self.balance = self.balance + amount
    }
}

actor Bank {
    var accounts: Array<Account> = []
    func open(_ a: Account) { self.accounts.append(a) }
    func count() -> Int { return self.accounts.count }
}

func main() {
    let u = User(name: "Alice", age: 30)
    let a = Account(owner: u, balance: 100)
    a.deposit(50)
    print(a.balance)                       // 150
}

诊断 ​

代码触发修复
S001重复定义改类型名
S004字段类型不匹配修正
S010协议不符合加一致性
A002跨 actor 访问未 await加 await
R007对 Optional 字段 !用 ?. / if let

与 Swift 的差异 ​

Swift structSYX
完整值语义拷贝部分实现
mutating func已实现(Phase 60+)
完整 class 单继承 + final已实现
actor 隔离已实现
data class 自动 ==/hash/encodeGA(L1 stored)
Swift 式自动 copy未实现
isolated deinit未实现(class 显式 deinit 已实现)
inout 形参未实现;用 &mut T 借用(部分实现)
嵌套类型部分实现(见 第 21 章)

下一章 → 属性

参见 → 语言参考:声明 · 第 9 章 枚举 · 第 11 章 属性 · 第 14 章 继承 · 第 19 章 宏

SYX · Apache-2.0