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
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
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
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
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
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
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
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
Importing Swift Code Piece of cake with frameworks! (Seriously, frameworks are amazing) 21 — Building Swift Static Libraries – Samuel Giddins @ iOS Dev Camp DC 2018
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
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
! 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
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
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
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
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
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
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
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
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
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
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
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
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
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