Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Simplify your life: build apps from reusable libraries

Simplify your life: build apps from reusable libraries

Originally posted here: https://speakerdeck.com/vashchenko/simplify-your-life-build-apps-from-reusable-libraries

Доклад включает в себя:
- Удобная организация кода в библиотеки
- Переиспользование библиотек - как это ускоряет разработку и делает вашу работу более продуктивной
- Live coding: как создать библиотеку на Swift c нуля

This talk was made for CocoaHeads Kyiv #14 which took place Oct 6 2018.

CocoaHeads Ukraine

October 06, 2018
Tweet

More Decks by CocoaHeads Ukraine

Other Decks in Programming

Transcript

  1. Simplify your life:
    build apps from reusable libraries

    View Slide

  2. Julia Vashchenko
    C++ macOS developer

    View Slide

  3. –Steve McConnell, 'Code Complete'
    “Managing complexity is the most important
    technical topic in software development.”

    View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. Versus
    Quiz

    View Slide

  8. Versus
    Quiz

    View Slide

  9. Library
    Framework

    View Slide

  10. View Slide

  11. Inversion of Control
    Conceptual difference
    Martin Fowler on Frameworks and Inversion of Control:

    View Slide

  12. View Slide

  13. View Slide

  14. View Slide

  15. View Slide

  16. FRAMEWORK CONTROLS YOU

    View Slide

  17. Library Framework
    Technical difference

    View Slide

  18. Library Framework
    Technical difference

    View Slide

  19. Explicit
    Dependencies in Xcode
    Implicit

    View Slide

  20. Explicit Dependencies

    View Slide

  21. Implicit Dependencies

    View Slide

  22. Static Dynamic
    libraries

    View Slide

  23. Static Dynamic

    View Slide

  24. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows

    View Slide

  25. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows
    .dylib on macOS, iOS
    .so on Linux
    .dll on Windows

    View Slide

  26. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows
    .dylib on macOS, iOS
    .so on Linux
    .dll on Windows
    Compilation INTO binary

    View Slide

  27. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows
    .dylib on macOS, iOS
    .so on Linux
    .dll on Windows
    Compilation INTO binary OUTSIDE the binary

    View Slide

  28. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows
    .dylib on macOS, iOS
    .so on Linux
    .dll on Windows
    Compilation INTO binary OUTSIDE the binary
    Binary Size bigger

    View Slide

  29. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows
    .dylib on macOS, iOS
    .so on Linux
    .dll on Windows
    Compilation INTO binary OUTSIDE the binary
    Binary Size bigger smaller

    View Slide

  30. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows
    .dylib on macOS, iOS
    .so on Linux
    .dll on Windows
    Compilation INTO binary OUTSIDE the binary
    Binary Size bigger smaller
    Application Load Time slower

    View Slide

  31. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows
    .dylib on macOS, iOS
    .so on Linux
    .dll on Windows
    Compilation INTO binary OUTSIDE the binary
    Binary Size bigger smaller
    Application Load Time slower faster

    View Slide

  32. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows
    .dylib on macOS, iOS
    .so on Linux
    .dll on Windows
    Compilation INTO binary OUTSIDE the binary
    Binary Size bigger smaller
    Application Load Time slower faster
    Binding Symbols at link time

    View Slide

  33. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows
    .dylib on macOS, iOS
    .so on Linux
    .dll on Windows
    Compilation INTO binary OUTSIDE the binary
    Binary Size bigger smaller
    Application Load Time slower faster
    Binding Symbols at link time at run time

    View Slide

  34. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows
    .dylib on macOS, iOS
    .so on Linux
    .dll on Windows
    Compilation INTO binary OUTSIDE the binary
    Binary Size bigger smaller
    Application Load Time slower faster
    Binding Symbols at link time at run time
    Library Update Mechanism rebuild host application

    View Slide

  35. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows
    .dylib on macOS, iOS
    .so on Linux
    .dll on Windows
    Compilation INTO binary OUTSIDE the binary
    Binary Size bigger smaller
    Application Load Time slower faster
    Binding Symbols at link time at run time
    Library Update Mechanism rebuild host application updates separately

    View Slide

  36. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows
    .dylib on macOS, iOS
    .so on Linux
    .dll on Windows
    Compilation INTO binary OUTSIDE the binary
    Binary Size bigger smaller
    Application Load Time slower faster
    Binding Symbols at link time at run time
    Library Update Mechanism rebuild host application updates separately
    Usage in Playgrounds can't be used

    View Slide

  37. Static Dynamic
    File extension
    .a on Linux, macOS, iOS
    .lib on Windows
    .dylib on macOS, iOS
    .so on Linux
    .dll on Windows
    Compilation INTO binary OUTSIDE the binary
    Binary Size bigger smaller
    Application Load Time slower faster
    Binding Symbols at link time at run time
    Library Update Mechanism rebuild host application updates separately
    Usage in Playgrounds can't be used is used

    View Slide

  38. View Slide

  39. LLVM Clang

    View Slide

  40. compiler backend compiler frontend
    LLVM Clang

    View Slide

  41. C, C++, Objective-C, Objective-C++
    LLVM Clang

    View Slide

  42. ActionScript, Ada, C, C#, C++, Common Lisp,
    Crystal, CUDA, D, Delphi, Fortran, Graphical G
    Programming Language, Halide, Haskell, Java
    bytecode, Julia, Kotlin, Lua, Objective-C,
    OpenGL Shading Language, Pony, Python, R,
    Ruby, Rust, Scala, Swift, Xojo
    LLVM Clang
    C, C++, Objective-C, Objective-C++

    View Slide

  43. ActionScript, Ada, C, C#, C++, Common Lisp,
    Crystal, CUDA, D, Delphi, Fortran, Graphical G
    Programming Language, Halide, Haskell, Java
    bytecode, Julia, Kotlin, Lua, Objective-C,
    OpenGL Shading Language, Pony, Python, R,
    Ruby, Rust, Scala, Swift, Xojo
    LLVM Clang
    C, C++, Objective-C, Objective-C++

    View Slide

  44. Compiling Linking

    View Slide

  45. Compiling Linking
    +

    View Slide

  46. Compiling Linking
    +
    Headers

    View Slide

  47. Compiling Linking
    +
    Headers Object files
    ↓ ↓

    View Slide

  48. #include
    #import
    @import

    View Slide

  49. Modules

    View Slide

  50. What languages support
    modules?

    View Slide

  51. C++
    Ada
    Julia
    Swift
    JavaScript
    Objective-C
    Python IBM/360 Assembler
    Perl
    C#
    Haskell
    Ruby
    Pascal
    Turbo Pascal
    Clojure
    Java

    View Slide

  52. C++
    Ada
    Julia
    Swift
    JavaScript
    Objective-C
    Python IBM/360 Assembler
    Perl
    C#
    Haskell
    Ruby
    Pascal
    Turbo Pascal
    Clojure
    Java

    View Slide

  53. C++
    Ada
    Julia
    Swift
    JavaScript
    Objective-C
    Python IBM/360 Assembler
    Perl
    C#
    Haskell
    Ruby
    Pascal
    Turbo Pascal
    Clojure
    Java

    View Slide

  54. Swift
    module
    Clang
    module

    View Slide

  55. Swift
    module
    Clang
    module

    View Slide

  56. Swift
    module
    Clang
    module

    View Slide

  57. How to manage lib updates

    View Slide

  58. How to manage lib updates
    • do not manage

    View Slide

  59. How to manage lib updates
    • do not manage
    • via Swift Package Manager: depend on private repo

    View Slide

  60. How to manage lib updates
    • do not manage
    • via Swift Package Manager: depend on private repo
    • via CocoaPods: Private Pod

    View Slide

  61. How to manage lib updates
    • do not manage
    • via Swift Package Manager: depend on private repo
    • via CocoaPods: Private or Local Pod
    • via Git Submodule

    View Slide

  62. Swift Package Manager
    Using GitHub Deploy Key
    Package.swift:
    Type in Terminal:

    View Slide

  63. Swift Package Manager
    Using GitHub Deploy Key
    Config file contents:
    GitHub.com → Your Profile → Repositories → Settings → Deploy Keys → Add deploy key →
    paste public key → check ‘Allow write access’

    View Slide

  64. CocoaPods
    Using Private&Local Pods

    View Slide

  65. CocoaPods
    Using Private&Local Pods
    17:30
    Modularizing your iOS apps

    View Slide

  66. Git Submodules

    View Slide

  67. Git Submodules

    View Slide

  68. Building Swift module
    in Xcode

    View Slide

  69. Building Swift module
    in Xcode

    View Slide

  70. Building Swift module
    without Xcode

    View Slide

  71. Building Swift module
    without Xcode

    View Slide

  72. Demo:
    Making & Using a
    Framework

    View Slide

  73. Troubleshooting
    common problems

    View Slide

  74. Error type Check:
    Compilation error HEADER_SEARCH_PATHS
    Xcode doesn’t build subproject Implicit Dependencies in ‘Schemes’ should be checked
    Linker error
    1. Is there a function with exact name?
    2. Is is implemented?
    Xcode can’t find a built library LIBRARIES_SEARCH_PATHS
    Static library doesn’t work for simulator Use lipo tool to add missing architecture

    View Slide

  75. View Slide