本简短教程将带您了解使用 Apollo iOS 生成 Swift 代码的基本概念Apollo iOS。我们将向您介绍代码生成的核心功能,并通过使用 GraphQL 模式 和 GraphQL 操作 生成 Swift 代码的过程进行演示。
首先创建一个新的目录,并进入它
1
mkdir ios-code-gen-example
我们将使用本例中的 StarWars GraphQL API 进行示例。您可以使用 Apollo Studio 查看此模式。
在 Apollo Studio 的右侧找到下载模式的下拉菜单,如图中所示。Apollo Studio 支持两种模式下载。JSON
或 原始
格式。在本教程中,请选择 原始
选项以下载 模式定义语言(SDL)格式的 GraphQL 模式。
点击 原始
将下载一个名为 [email protected]
的文件。
将已下栽的文件 [email protected]
拖动或复制到您在 第一步 中创建的目录中。
将文件扩展名从 .graphql
改为 .graphqls
。注意文件扩展名的 s
代表这是一个 GraphQL 模式文件。
您还需要创建一个 GraphQL 操作文件,因为代码生成引擎需要模式和至少一个操作才能生成代码。
我们将使用 所有电影查询操作 作为示例。点击此链接将以 Apollo Studio 中的资源管理器打开,您可以选择您想要提取的字段。或者,下面的 查询 文本已经选择了字段。
将查询文本复制,并在 第一步 中创建的目录中创建一个名为 AllFilmsQuery.graphql
的新文件。将此查询粘贴到新文件中。
在GitHub上浏览到 Apollo iOS版本列表,找到最新版本。在每次版本的资产列表中将会有一个先行编译好的命令行界面二进制文件称为 apollo-ios-cli.tar.gz
下载并解压此文件,然后将 apollo-ios-cli
二进制文件移动到你在 第1步 中创建的目录。
运行以下命令
1
./apollo-ios-cli init --schema-namespace StarWarsAPI --module-type swiftPackageManager
CLI 将创建一个名为 apollo-codegen-configuration.json
的配置文件,其中填写了默认值。文件应类似于以下内容:
2
"schemaNamespace": "StarWarsAPI",
4
"operationSearchPaths": ["**/*.graphql"],
5
"schemaSearchPaths": ["**/*.graphqls"]
14
"swiftPackageManager": {}
现在您可以生成一些代码了!运行以下命令
1
./apollo-ios-cli generate
您应该会在以下位置看到一个新文件创建:StarWarsAPI/Sources/Operations/Queries/Query.graphql.swift
,该文件看起来类似于以下内容:
4
@_exported import ApolloAPI
7
public class Query: GraphQLQuery {
8
public static let operationName: String = "Query"
9
public static let document: DocumentType = .notPersisted(
40
public struct Data: StarWarsAPI.SelectionSet {
41
public let __data: DataDict
42
public init(data: DataDict) { __data = data }
44
public static var __parentType: ParentType { StarWarsAPI.Objects.Root }
45
public static var __selections: [Selection] { [
46
.field("allFilms", AllFilms?.self),
49
public var allFilms: AllFilms? { __data["allFilms"] }
54
public struct AllFilms: StarWarsAPI.SelectionSet {
55
public let __data: DataDict
56
public init(data: DataDict) { __data = data }
58
public static var __parentType: ParentType { StarWarsAPI.Objects.FilmsConnection }
59
public static var __selections: [Selection] { [
60
.field("films", [Film?]?.self),
69
public var films: [Film?]? { __data["films"] }
74
public struct Film: StarWarsAPI.SelectionSet {
75
public let __data: DataDict
76
public init(data: DataDict) { __data = data }
78
public static var __parentType: ParentType { StarWarsAPI.Objects.Film }
79
public static var __selections: [Selection] { [
80
.field("title", String?.self),
81
.field("director", String?.self),
82
.field("releaseDate", String?.self),
83
.field("speciesConnection", SpeciesConnection?.self),
87
public var title: String? { __data["title"] }
89
public var director: String? { __data["director"] }
91
public var releaseDate: String? { __data["releaseDate"] }
92
public var speciesConnection: SpeciesConnection? { __data["speciesConnection"] }
97
public struct SpeciesConnection: StarWarsAPI.SelectionSet {
98
public let __data: DataDict
99
public init(data: DataDict) { __data = data }
101
public static var __parentType: ParentType { StarWarsAPI.Objects.FilmSpeciesConnection }
102
public static var __selections: [Selection] { [
103
.field("species", [Specy?]?.self),
112
public var species: [Specy?]? { __data["species"] }
117
public struct Specy: StarWarsAPI.SelectionSet {
118
public let __data: DataDict
119
public init(data: DataDict) { __data = data }
121
public static var __parentType: ParentType { StarWarsAPI.Objects.Species }
122
public static var __selections: [Selection] { [
123
.field("name", String?.self),
124
.field("classification", String?.self),
125
.field("homeworld", Homeworld?.self),
129
public var name: String? { __data["name"] }
131
public var classification: String? { __data["classification"] }
133
public var homeworld: Homeworld? { __data["homeworld"] }
138
public struct Homeworld: StarWarsAPI.SelectionSet {
139
public let __data: DataDict
140
public init(data: DataDict) { __data = data }
142
public static var __parentType: ParentType { StarWarsAPI.Objects.Planet }
143
public static var __selections: [Selection] { [
144
.field("name", String?.self),
148
public var name: String? { __data["name"] }
这样就这样!您也可以通过使用Apollo iOS客户端来审查所有其他生成的文件,以更深入地了解代码生成的工作原理。