@segiddins
Mobile Developer Experience @ Square
CocoaPods Core Contributor
2 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 3
Slide 3 text
Mobile Developer Experience
⇢Owns the build system, dependency manager,
interface with CI
⇢Maintains the (open source) tools used to build the
app
⇢Keeps developers as productive as possible
⇢Cross platform: iOS & Android
⇢Develops CocoaPods features
3 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 4
Slide 4 text
CocoaPods @ Square
⇢265 total pods
⇢Swift, Objective-C
⇢Dynamic Frameworks, Static Libraries, Static
Frameworks
⇢Monorepo & Multirepo
4 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 5
Slide 5 text
A (Brief) History of Swift Linkage
⇢SwiftyThing.framework From Xcode
⇢ SwiftyThing (as a dynamic library)
⇢libSwiftyThing.a From Swift PM
⇢... And that's it!
5 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 6
Slide 6 text
Until Xcode 9
6 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 7
Slide 7 text
Xcode 9 added the ability to build Swift
into static libraries
7 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 8
Slide 8 text
Why static libraries?
⇢Easier to obfuscate / strip dead code
⇢No overhead on app launch
⇢Possible to have true single-file executables
8 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 9
Slide 9 text
Aside:
This also means you can now build Swift
static frameworks, if you like!
9 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 10
Slide 10 text
What static libraries don't fix:
⇢ABI stability
⇢Module format stability
⇢Clang Modules
⇢Swift compiler performance
⇢Buggy code
10 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 11
Slide 11 text
But:
They did allow us to start building
Swift pods
11 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 12
Slide 12 text
So, how do these magic new libraries work?
12 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 13
Slide 13 text
Swift Static Libraries, In Practice
13 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 14
Slide 14 text
Swift Static Libraries, In Practice
Surprisingly simple!
1. Create an app / command line target
2. Create a static library target
1. Delete Objective-C files
2. Add a Swift file
3. Link the static library into the app
4. Build & Run
5. Profit‽
14 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 15
Slide 15 text
But:
Only if you don't want to use any
of the code in the static library
in another target
15 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 16
Slide 16 text
So,
no profit.
16 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 17
Slide 17 text
The hardest part of building
Swift static libraries has been using them
17 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 18
Slide 18 text
Frameworks make importing Swift code easy
18 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 19
Slide 19 text
Importing Swift Code
1. .modulemap
2. Headers
3. .swiftmodule
4. Generated -Swift.h Bridging Header
19 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 20
Slide 20 text
Importing Swift Code
Objective-C:
$ clang -F path/to/framework -f FrameworkName ...
Swift:
$ swiftc -F path/to/framework -f FrameworkName ...
20 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 21
Slide 21 text
Importing Swift Code
Piece of cake with frameworks!
(Seriously, frameworks are amazing)
21 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 22
Slide 22 text
On the other hand:
Static librarys Manual integration
22 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 23
Slide 23 text
Aside:
Most of this is all trivia I learned integrating Swift
static library support into CocoaPods.
If I could do it all again, I would've just made static
frameworks work and call it a day.
23 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 24
Slide 24 text
Now entering:
Compiler
24 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 25
Slide 25 text
Compilers Magic
But constructing correct compiler arguments by
hand is tedious and error prone and
it's 2018 and no one should ever need to do it
25 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 26
Slide 26 text
⚠
Detour into Clang Modules
26 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 27
Slide 27 text
!
I gave a talk about this particular, highly painful,
subject at try! Swift Tokyo 2018
27 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 28
Slide 28 text
Clang Modules & Swift Modules are highly related
28 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 29
Slide 29 text
For Swift to import Objective-C:
⇢Bridging Header
!
⇢Modules for the imported code
For Objective-C to import Swift:
⇢Directly import generated -Swift.h header
⇢Import the generated module
29 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 30
Slide 30 text
Seeing a pattern here?
30 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 31
Slide 31 text
Modules are the lingua franca by which
Swift and Objective-C are meant to bridge
31 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 32
Slide 32 text
Modules are created automatically
when building frameworks in Xcode
32 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 33
Slide 33 text
This is where the heavy lifting comes in for
manually integrating static libraries
33 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 34
Slide 34 text
Clang:
$ clang -fmodule-map-path=path/to/Library.modulemap
Swift:
$ swiftc -Xcc -fmodule-map-path=path/to/Library.modulemap -I dir/of/other/library.swiftmodule
34 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 35
Slide 35 text
This is what enables imports to work
Objective-C:
@import Library;
Swift:
import Library
35 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 36
Slide 36 text
Why does being able to use imports matter?
⇢It allows libraries to import other libraries
⇢It gets rid of buggy bridging headers
⇢Modular imports are semantic, and don't need to
be tied to particular header names
36 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 37
Slide 37 text
How do I mix Swift & Objective-C in one library?
37 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 38
Slide 38 text
How do I mix Swift & Objective-C in one library?
Trivial with frameworks.
⇢Objective-C headers in the module map are
immediately usable from Swift
⇢#import from Objective-C
38 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 39
Slide 39 text
How do I mix Swift & Objective-C in one library?
⇢Pass the module map to both clang & swiftc
⇢Pass the path to the generated Objective-C
interface to clang
⇢Experience all new compiler segfaults
39 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 40
Slide 40 text
Your developers were so
preoccupied with whether
or not they could,
they didn't stop to think if
they should.
— Jurassic Park
40 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 41
Slide 41 text
Should I...
⇢Mix Swift & Objective-C?
⇢Mix static libraries & dynamic frameworks?
⇢Mix static libraries & static frameworks?
41 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 42
Slide 42 text
But Samuel,
what if that looks like a lot of work?
42 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 43
Slide 43 text
Never fear!
We're programmers, so we have pre-written
solutions!
43 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 44
Slide 44 text
Pre-written solutions:
⇢Swift Package Manager
⇢CocoaPods
⇢
❌
Xcode
44 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 45
Slide 45 text
In CocoaPods
45 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 46
Slide 46 text
In CocoaPods
⇢Released in v1.5
⇢Mixed Swift / Objective-C libraries
⇢Objective-C & Swift can both import from Swift
static libraries
⇢Just remove use_frameworks!
⇢You're
!
good to go
46 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 47
Slide 47 text
Known Rough Edges
⇢Mixing (precompiled) bridging headers & modules
⇢Swift autocomplete
⇢The path of the Swift generated interface to import
⇢Too many compiler flags
⇢None of this was meant to work in this way.
⇢At all.
47 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 48
Slide 48 text
So, Samuel, if it's all so terrible, why did you add
support in CocoaPods and start using it at work?
48 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 49
Slide 49 text
We didn't know what we were getting into.
Honestly.
49 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 50
Slide 50 text
Swift is the Future
50 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 51
Slide 51 text
Swift is the Future
Being able to write it now, and write libraries with
Swift, is worth the tradeoff. It's better than
developing a massive hairball or ignoring the future
of platform development.
51 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 52
Slide 52 text
What's next?
52 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
Slide 53
Slide 53 text
Samuel Giddins
@segiddins
53 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018