-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtargets.html
396 lines (373 loc) · 26 KB
/
targets.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
<!DOCTYPE html>
<html lang="en">
<head>
<title>Targets Reference</title>
<link rel="stylesheet" type="text/css" href="css/jazzy.css" />
<link rel="stylesheet" type="text/css" href="css/highlight.css" />
<meta charset='utf-8'>
<script src="js/jquery.min.js" defer></script>
<script src="js/jazzy.js" defer></script>
</head>
<body>
<a title="Targets Reference"></a>
<header>
<div class="content-wrapper">
<p><a href="index.html">Moya Docs</a> (82% documented)</p>
</div>
</header>
<div class="content-wrapper">
<p id="breadcrumbs">
<a href="index.html">Moya Reference</a>
<img id="carat" src="img/carat.png" />
Targets Reference
</p>
</div>
<div class="content-wrapper">
<nav class="sidebar">
<ul class="nav-groups">
<li class="nav-group-name">
<a href="Guides.html">Guides</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="authentication.html">Authentication</a>
</li>
<li class="nav-group-task">
<a href="communityprojects.html">CommunityProjects</a>
</li>
<li class="nav-group-task">
<a href="endpoints.html">Endpoints</a>
</li>
<li class="nav-group-task">
<a href="plugins.html">Plugins</a>
</li>
<li class="nav-group-task">
<a href="providers.html">Providers</a>
</li>
<li class="nav-group-task">
<a href="readme.html">README</a>
</li>
<li class="nav-group-task">
<a href="reactiveswift.html">ReactiveSwift</a>
</li>
<li class="nav-group-task">
<a href="releasing.html">Releasing</a>
</li>
<li class="nav-group-task">
<a href="rxswift.html">RxSwift</a>
</li>
<li class="nav-group-task">
<a href="targets.html">Targets</a>
</li>
<li class="nav-group-task">
<a href="testing.html">Testing</a>
</li>
<li class="nav-group-task">
<a href="threading.html">Threading</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Classes.html">Classes</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Classes/CancellableToken.html">CancellableToken</a>
</li>
<li class="nav-group-task">
<a href="Classes/CredentialsPlugin.html">CredentialsPlugin</a>
</li>
<li class="nav-group-task">
<a href="Classes/Endpoint.html">Endpoint</a>
</li>
<li class="nav-group-task">
<a href="Classes/MoyaProvider.html">MoyaProvider</a>
</li>
<li class="nav-group-task">
<a href="Classes/NetworkActivityPlugin.html">NetworkActivityPlugin</a>
</li>
<li class="nav-group-task">
<a href="Classes/NetworkLoggerPlugin.html">NetworkLoggerPlugin</a>
</li>
<li class="nav-group-task">
<a href="Classes/NetworkLoggerPlugin/Configuration.html">– Configuration</a>
</li>
<li class="nav-group-task">
<a href="Classes/Response.html">Response</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Enums.html">Enumerations</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Enums/AuthorizationType.html">AuthorizationType</a>
</li>
<li class="nav-group-task">
<a href="Enums/EndpointSampleResponse.html">EndpointSampleResponse</a>
</li>
<li class="nav-group-task">
<a href="Enums/MoyaError.html">MoyaError</a>
</li>
<li class="nav-group-task">
<a href="Enums/MultiTarget.html">MultiTarget</a>
</li>
<li class="nav-group-task">
<a href="Enums/NetworkActivityChangeType.html">NetworkActivityChangeType</a>
</li>
<li class="nav-group-task">
<a href="Enums/StubBehavior.html">StubBehavior</a>
</li>
<li class="nav-group-task">
<a href="Enums/Task.html">Task</a>
</li>
<li class="nav-group-task">
<a href="Enums/ValidationType.html">ValidationType</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Extensions.html">Extensions</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Extensions/Method.html">Method</a>
</li>
<li class="nav-group-task">
<a href="Extensions/Request.html">Request</a>
</li>
<li class="nav-group-task">
<a href="Extensions/URL.html">URL</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Functions.html">Functions</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Functions.html#/s:4Moya23convertResponseToResult_7request4data5errors0E0OyAA0C0CAA0A5ErrorOGSo17NSHTTPURLResponseCSg_10Foundation10URLRequestVSgAP4DataVSgs0I0_pSgtF">convertResponseToResult(_:request:data:error:)</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Protocols.html">Protocols</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Protocols/AccessTokenAuthorizable.html">AccessTokenAuthorizable</a>
</li>
<li class="nav-group-task">
<a href="Protocols/Cancellable.html">Cancellable</a>
</li>
<li class="nav-group-task">
<a href="Protocols/MoyaProviderType.html">MoyaProviderType</a>
</li>
<li class="nav-group-task">
<a href="Protocols/PluginType.html">PluginType</a>
</li>
<li class="nav-group-task">
<a href="Protocols/RequestType.html">RequestType</a>
</li>
<li class="nav-group-task">
<a href="Protocols/TargetType.html">TargetType</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Structs.html">Structures</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Structs/AccessTokenPlugin.html">AccessTokenPlugin</a>
</li>
<li class="nav-group-task">
<a href="Structs/MultipartFormData.html">MultipartFormData</a>
</li>
<li class="nav-group-task">
<a href="Structs/MultipartFormData/FormDataProvider.html">– FormDataProvider</a>
</li>
<li class="nav-group-task">
<a href="Structs/ProgressResponse.html">ProgressResponse</a>
</li>
</ul>
</li>
<li class="nav-group-name">
<a href="Typealiases.html">Type Aliases</a>
<ul class="nav-group-tasks">
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya10Completiona">Completion</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya19DownloadDestinationa">DownloadDestination</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya5Imagea">Image</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/ImageType">ImageType</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya9ImageTypea">ImageType</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya12JSONEncodinga">JSONEncoding</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya6Methoda">Method</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya17ParameterEncodinga">ParameterEncoding</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya13ProgressBlocka">ProgressBlock</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya18RequestInterceptora">RequestInterceptor</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya24RequestMultipartFormDataa">RequestMultipartFormData</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya7Sessiona">Session</a>
</li>
<li class="nav-group-task">
<a href="Typealiases.html#/s:4Moya11URLEncodinga">URLEncoding</a>
</li>
</ul>
</li>
</ul>
</nav>
<article class="main-content">
<section>
<section class="section">
<h1 id='targets' class='heading'>Targets</h1>
<p>Using Moya starts with defining a target – typically some <code>enum</code> that conforms
to the <code><a href="Protocols/TargetType.html">TargetType</a></code> protocol. Then, the rest of your app deals <em>only</em> with
those targets. Targets are some action that you want to take on the API,
like <q>`favoriteTweet(tweetID: String)`</q>.</p>
<p>Here’s an example:</p>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="kd">enum</span> <span class="kt">GitHub</span> <span class="p">{</span>
<span class="k">case</span> <span class="n">zen</span>
<span class="k">case</span> <span class="nf">userProfile</span><span class="p">(</span><span class="kt">String</span><span class="p">)</span>
<span class="k">case</span> <span class="nf">userRepositories</span><span class="p">(</span><span class="kt">String</span><span class="p">)</span>
<span class="k">case</span> <span class="nf">branches</span><span class="p">(</span><span class="kt">String</span><span class="p">,</span> <span class="kt">Bool</span><span class="p">)</span>
<span class="p">}</span>
</code></pre>
<p>Targets must conform to <code><a href="Protocols/TargetType.html">TargetType</a></code>. The <code><a href="Protocols/TargetType.html">TargetType</a></code> protocol requires a
<code>baseURL</code> property to be defined on the enum. Note that this should <em>not</em> depend
on the value of <code>self</code>, but should just return a single value (if you’re using
more than one API base URL, separate them out into separate enums and Moya
providers). Here’s the beginning of our extension:</p>
<pre class="highlight swift"><code><span class="kd">extension</span> <span class="kt">GitHub</span><span class="p">:</span> <span class="kt">TargetType</span> <span class="p">{</span>
<span class="kd">public</span> <span class="k">var</span> <span class="nv">baseURL</span><span class="p">:</span> <span class="kt">URL</span> <span class="p">{</span> <span class="k">return</span> <span class="kt">URL</span><span class="p">(</span><span class="nv">string</span><span class="p">:</span> <span class="s">"https://api.github.com"</span><span class="p">)</span><span class="o">!</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre>
<p>This protocol specifies the locations of
your API endpoints, relative to its base URL (more on that below).</p>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="k">var</span> <span class="nv">path</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span>
<span class="k">switch</span> <span class="k">self</span> <span class="p">{</span>
<span class="k">case</span> <span class="o">.</span><span class="nv">zen</span><span class="p">:</span>
<span class="k">return</span> <span class="s">"/zen"</span>
<span class="k">case</span> <span class="o">.</span><span class="nf">userProfile</span><span class="p">(</span><span class="k">let</span> <span class="nv">name</span><span class="p">):</span>
<span class="k">return</span> <span class="s">"/users/</span><span class="se">\(</span><span class="n">name</span><span class="o">.</span><span class="n">urlEscaped</span><span class="se">)</span><span class="s">"</span>
<span class="k">case</span> <span class="o">.</span><span class="nf">userRepositories</span><span class="p">(</span><span class="k">let</span> <span class="nv">name</span><span class="p">):</span>
<span class="k">return</span> <span class="s">"/users/</span><span class="se">\(</span><span class="n">name</span><span class="o">.</span><span class="n">urlEscaped</span><span class="se">)</span><span class="s">/repos"</span>
<span class="k">case</span> <span class="o">.</span><span class="nf">branches</span><span class="p">(</span><span class="k">let</span> <span class="nv">repo</span><span class="p">,</span> <span class="n">_</span><span class="p">):</span>
<span class="k">return</span> <span class="s">"/repos/</span><span class="se">\(</span><span class="n">repo</span><span class="o">.</span><span class="n">urlEscaped</span><span class="se">)</span><span class="s">/branches"</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
<p>Notice that we’re ignoring the second associated value of our <code>branches</code> Target using the Swift <code>_</code> ignored-value symbol. That’s because we don’t need it to define the <code>branches</code> path.
Note: we’re cheating here and using a <code>urlEscaped</code> extension on String.
A sample implementation is given at the end of this document.</p>
<p>OK, cool. So now we need to have a <code>method</code> for our enum values. In our case, we
are always using the GET HTTP method, so this is pretty easy:</p>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="k">var</span> <span class="nv">method</span><span class="p">:</span> <span class="kt">Moya</span><span class="o">.</span><span class="kt">Method</span> <span class="p">{</span>
<span class="k">return</span> <span class="o">.</span><span class="k">get</span>
<span class="p">}</span>
</code></pre>
<p>Nice. If some of your endpoints require POST or another method, then you can switch
on <code>self</code> to return the appropriate value. This kind of switching technique is what
we saw when calculating our <code>path</code> property.</p>
<p>Our <code><a href="Protocols/TargetType.html">TargetType</a></code> is shaping up, but we’re not done yet. We also need a <code>task</code>
computed property that returns the task type potentially including parameters.
Here’s an example:</p>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="k">var</span> <span class="nv">task</span><span class="p">:</span> <span class="kt">Task</span> <span class="p">{</span>
<span class="k">switch</span> <span class="k">self</span> <span class="p">{</span>
<span class="k">case</span> <span class="o">.</span><span class="nv">userRepositories</span><span class="p">:</span>
<span class="k">return</span> <span class="o">.</span><span class="nf">requestParameters</span><span class="p">(</span><span class="nv">parameters</span><span class="p">:</span> <span class="p">[</span><span class="s">"sort"</span><span class="p">:</span> <span class="s">"pushed"</span><span class="p">],</span> <span class="nv">encoding</span><span class="p">:</span> <span class="kt">URLEncoding</span><span class="o">.</span><span class="k">default</span><span class="p">)</span>
<span class="k">case</span> <span class="o">.</span><span class="nf">branches</span><span class="p">(</span><span class="n">_</span><span class="p">,</span> <span class="k">let</span> <span class="nv">protected</span><span class="p">):</span>
<span class="k">return</span> <span class="o">.</span><span class="nf">requestParameters</span><span class="p">(</span><span class="nv">parameters</span><span class="p">:</span> <span class="p">[</span><span class="s">"protected"</span><span class="p">:</span> <span class="s">"</span><span class="se">\(</span><span class="n">protected</span><span class="se">)</span><span class="s">"</span><span class="p">],</span> <span class="nv">encoding</span><span class="p">:</span> <span class="kt">URLEncoding</span><span class="o">.</span><span class="k">default</span><span class="p">)</span>
<span class="k">default</span><span class="p">:</span>
<span class="k">return</span> <span class="o">.</span><span class="n">requestPlain</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
<p>Unlike our <code>path</code> property earlier, we don’t actually care about the associated values of our <code>userRepositories</code> case, so we just skip parenthesis.
Let’s take a look at the <code>branches</code> case: we’ll use our <code>Bool</code> associated value (<code>protected</code>) as a request parameter by assigning it to the <code>"protected"</code> key. We’re parsing our <code>Bool</code> value to <code>String</code>. (Alamofire does not encode <code>Bool</code> parameters automatically, so we need to do it by our own).</p>
<p>While we are talking about parameters, we needed to indicate how we want our
parameters to be encoded into our request. We do this by returning a
<code><a href="Typealiases.html#/s:4Moya17ParameterEncodinga">ParameterEncoding</a></code> alongside the <code>.requestParameters</code> task type. Out of the
box, Moya has <code><a href="Typealiases.html#/s:4Moya11URLEncodinga">URLEncoding</a></code>, <code><a href="Typealiases.html#/s:4Moya12JSONEncodinga">JSONEncoding</a></code>, and <code>PropertyListEncoding</code>. You can
also create your own encoder that conforms to <code><a href="Typealiases.html#/s:4Moya17ParameterEncodinga">ParameterEncoding</a></code> (e.g.
<code>XMLEncoder</code>).</p>
<p>A <code>task</code> property represents how you are sending / receiving data and allows you to add data, files and streams to the request body. There are several <code>.request</code> types:</p>
<ul>
<li><code>.requestPlain</code> with nothing to send at all</li>
<li><code>.requestData(_:)</code> with which you can send <code>Data</code></li>
<li><code>.requestJSONEncodable(_:)</code> with which you can send objects that conform to the <code>Encodable</code> protocol</li>
<li><code>.requestCustomJSONEncodable(_:encoder:)</code> which allows you to send objects conforming to <code>Encodable</code> encoded with provided custom JSONEncoder</li>
<li><code>.requestParameters(parameters:encoding:)</code> which allows you to send parameters with an encoding</li>
<li><code>.requestCompositeData(bodyData:urlParameters:)</code> & <code>.requestCompositeParameters(bodyParameters:bodyEncoding:urlParameters)</code> which allow you to combine url encoded parameters with another type (data / parameters)</li>
</ul>
<p>Also, there are three upload types: </p>
<ul>
<li><code>.uploadFile(_:)</code> to upload a file from a URL,</li>
<li><code>.uploadMultipart(_:)</code> for multipart uploads</li>
<li><code>.uploadCompositeMultipart(_:urlParameters:)</code> which allows you to pass multipart data and url parameters at once</li>
</ul>
<p>And two download types: </p>
<ul>
<li><code>.downloadDestination(_:)</code> for a plain file download</li>
<li><code>.downloadParameters(parameters:encoding:destination:)</code> for downloading with parameters sent alongside the request.</li>
</ul>
<p>Next, notice the <code>sampleData</code> property on the enum. This is a requirement of
the <code><a href="Protocols/TargetType.html">TargetType</a></code> protocol. Any target you want to hit must provide some non-nil
<code>Data</code> that represents a sample response. This can be used later for tests or
for providing offline support for developers. This <em>should</em> depend on <code>self</code>.</p>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="k">var</span> <span class="nv">sampleData</span><span class="p">:</span> <span class="kt">Data</span> <span class="p">{</span>
<span class="k">switch</span> <span class="k">self</span> <span class="p">{</span>
<span class="k">case</span> <span class="o">.</span><span class="nv">zen</span><span class="p">:</span>
<span class="k">return</span> <span class="s">"Half measures are as bad as nothing at all."</span><span class="o">.</span><span class="nf">data</span><span class="p">(</span><span class="nv">using</span><span class="p">:</span> <span class="kt">String</span><span class="o">.</span><span class="kt">Encoding</span><span class="o">.</span><span class="n">utf8</span><span class="p">)</span><span class="o">!</span>
<span class="k">case</span> <span class="o">.</span><span class="nf">userProfile</span><span class="p">(</span><span class="k">let</span> <span class="nv">name</span><span class="p">):</span>
<span class="k">return</span> <span class="s">"{</span><span class="se">\"</span><span class="s">login</span><span class="se">\"</span><span class="s">: </span><span class="se">\"\(</span><span class="n">name</span><span class="se">)\"</span><span class="s">, </span><span class="se">\"</span><span class="s">id</span><span class="se">\"</span><span class="s">: 100}"</span><span class="o">.</span><span class="nf">data</span><span class="p">(</span><span class="nv">using</span><span class="p">:</span> <span class="kt">String</span><span class="o">.</span><span class="kt">Encoding</span><span class="o">.</span><span class="n">utf8</span><span class="p">)</span><span class="o">!</span>
<span class="k">case</span> <span class="o">.</span><span class="nf">userRepositories</span><span class="p">(</span><span class="k">let</span> <span class="nv">name</span><span class="p">):</span>
<span class="k">return</span> <span class="s">"[{</span><span class="se">\"</span><span class="s">name</span><span class="se">\"</span><span class="s">: </span><span class="se">\"</span><span class="s">Repo Name</span><span class="se">\"</span><span class="s">}]"</span><span class="o">.</span><span class="nf">data</span><span class="p">(</span><span class="nv">using</span><span class="p">:</span> <span class="kt">String</span><span class="o">.</span><span class="kt">Encoding</span><span class="o">.</span><span class="n">utf8</span><span class="p">)</span><span class="o">!</span>
<span class="k">case</span> <span class="o">.</span><span class="nv">branches</span><span class="p">:</span>
<span class="k">return</span> <span class="s">"[{</span><span class="se">\"</span><span class="s">name</span><span class="se">\"</span><span class="s">: </span><span class="se">\"</span><span class="s">master</span><span class="se">\"</span><span class="s">}]"</span><span class="o">.</span><span class="nf">data</span><span class="p">(</span><span class="nv">using</span><span class="p">:</span> <span class="kt">String</span><span class="o">.</span><span class="kt">Encoding</span><span class="o">.</span><span class="n">utf8</span><span class="p">)</span><span class="o">!</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
<p>Finally, the <code>headers</code> property stores header fields that should be sent on the request.</p>
<pre class="highlight swift"><code><span class="kd">public</span> <span class="k">var</span> <span class="nv">headers</span><span class="p">:</span> <span class="p">[</span><span class="kt">String</span><span class="p">:</span> <span class="kt">String</span><span class="p">]?</span> <span class="p">{</span>
<span class="k">return</span> <span class="p">[</span><span class="s">"Content-Type"</span><span class="p">:</span> <span class="s">"application/json"</span><span class="p">]</span>
<span class="p">}</span>
</code></pre>
<p>After this setup, creating our <a href="Providers.md">Provider</a> is as easy as the following:</p>
<pre class="highlight swift"><code><span class="k">let</span> <span class="nv">GitHubProvider</span> <span class="o">=</span> <span class="kt">MoyaProvider</span><span class="o"><</span><span class="kt">GitHub</span><span class="o">></span><span class="p">()</span>
</code></pre>
<h2 id='escaping-urls' class='heading'>Escaping URLs</h2>
<p>Here’s an example extension that allows you to easily escape normal strings
<q>like this</q> to URL-encoded strings <q>like%20this</q>:</p>
<pre class="highlight swift"><code><span class="kd">extension</span> <span class="kt">String</span> <span class="p">{</span>
<span class="k">var</span> <span class="nv">urlEscaped</span><span class="p">:</span> <span class="kt">String</span> <span class="p">{</span>
<span class="k">return</span> <span class="nf">addingPercentEncoding</span><span class="p">(</span><span class="nv">withAllowedCharacters</span><span class="p">:</span> <span class="o">.</span><span class="n">urlHostAllowed</span><span class="p">)</span><span class="o">!</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
</section>
</section>
<section id="footer">
<p>© 2020 <a class="link" href="https://github.com/Moya/Moya" target="_blank" rel="external">Ash Furrow</a>. All rights reserved. (Last updated: 2020-02-24)</p>
<p>Generated by <a class="link" href="https://github.com/realm/jazzy" target="_blank" rel="external">jazzy ♪♫ v0.9.6</a>, a <a class="link" href="https://realm.io" target="_blank" rel="external">Realm</a> project.</p>
</section>
</article>
</div>
</body>
</div>
</html>