跳到主要内容
版本:dev

Swift

输出布局​

Swift 输出为每个 Schema 生成一个 .swift 文件,例如:

  • <swift_out>/addressbook/addressbook.swift

类型生成​

生成器使用拆分模型宏和稳定字段/case ID 创建 Swift 模型。类型化联合必须包含一个带 @ForyUnknownCase 标记的 case 和至少一个 Schema 定义的 case;unknown(UnknownCase) 是 Fory 提供的向前兼容载体的默认名称。该标记只选择载体,不会向 Schema case 表添加条目。 名称冲突时,生成的载体名为 unknown_;如果该名称也冲突,则会报错。Schema case 名称保持不变。

当包/命名空间非空时,命名空间形状由 swift_namespace_style 控制:

  • enum(默认):嵌套枚举命名空间包装器。
  • flatten:顶层类型名称使用从包派生的前缀(例如 Demo_Foo_User)。

当包/命名空间为空时,不应用枚举包装器或扁平化前缀。

对于使用默认 enum 风格的非空包:

public enum Addressbook {
@ForyUnion
public enum Animal {
@ForyUnknownCase
case unknown(UnknownCase)
@ForyCase(id: 0)
case dog(Addressbook.Dog)
@ForyCase(id: 1)
case cat(Addressbook.Cat)
}

@ForyStruct
public struct Person: Equatable {
@ForyField(id: 1)
public var name: String = ""
@ForyField(id: 8)
public var pet: Addressbook.Animal =
Addressbook.Animal.dog(Addressbook.Dog())
}
}

对于使用 flatten 风格的非空包:

@ForyStruct
public struct Addressbook_Person: Equatable { ... }

两者都设置时,CLI flag --swift_namespace_style 会覆盖 Schema 选项 swift_namespace_style。

联合生成为带关联载荷值的 tagged Swift 枚举。递归联合生成为 indirect 枚举。第一个已知 联合 case 必须具有有限、可递归构造的默认值;编译器会拒绝第一个 case 的默认值环,而 不是生成不会终止的初始化器。带 ref/weak_ref 字段的消息生成为 final class 模型, 以保留引用语义。直接存储的消息环必须将至少一条环边标记为 ref;否则编译器会拒绝 Schema,因为 Swift 值类型无法表示这种结构。list/map 字段中的固定或 tagged 整数编码 生成为 Swift 字段类型提示,例如 @ListField(element: .encoding(.fixed)) 或 @MapField(value: .encoding(.tagged))。对于非空固定宽度整数 list 元素,Swift 将字段 分类为对应的 Fory 基本类型 packed-array 类型;固定宽度整数 set 仍为 Fory set。

模块安装​

每个 Schema 都包含一个具有传递导入安装能力的 ForyModule 所有者:

public enum ForyModule {
public static func install(_ fory: Fory) throws {
try ComplexPb.ForyModule.install(fory)
try fory.register(Addressbook.Person.self, id: 100)
try fory.register(Addressbook.Animal.self, id: 106)
}
}

对于非空包和 flatten 风格,辅助类型也会添加前缀(例如 Addressbook_ForyModule)。

对于没有显式 [id=...] 的 Schema,安装代码使用计算得到的数字 ID。如果设置了 option enable_auto_type_id = false;,生成的代码使用基于名称的注册 API。

当所有字段都支持时,生成的模型会声明 Equatable,但不会声明 Sendable。请以 Swift 5 语言模式编译;Swift 6 严格并发检查会拒绝将它们传递跨越隔离边界。

gRPC 配套服务代码​

使用 --grpc 时,Swift 为每个服务生成一个 <Service>Grpc.swift,包含 <Base>Provider、<Base>AsyncProvider、<Base>AsyncClient 和 <Base>Metadata,其中 <Base> 带有包名前缀。依赖、流式调用形式和使用方法见 Swift gRPC。