Slide 1

Slide 1 text

CROSS-PLATFORM SWIFT JP SIMARD – @SIMJP – TRY! SWIFT – TOKYO – MARCH 2, 2016 1

Slide 2

Slide 2 text

2

Slide 3

Slide 3 text

Jazzy & SwiftLint 3

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

WE'LL GO OVER... > Development Environment > Swift Package Manager > Testing > Continuous Integration 5

Slide 6

Slide 6 text

EXACTLY 2 PLATFORMS 6

Slide 7

Slide 7 text

EXACTLY 3 PLATFORMS 7

Slide 8

Slide 8 text

EXACTLY 3-ISH PLATFORMS 8

Slide 9

Slide 9 text

9

Slide 10

Slide 10 text

EXPECTATION 10

Slide 11

Slide 11 text

EXPECTATION 11

Slide 12

Slide 12 text

EXPECTATION 12

Slide 13

Slide 13 text

REALITY 13

Slide 14

Slide 14 text

14

Slide 15

Slide 15 text

15

Slide 16

Slide 16 text

! APPLE'S DOING A GREAT JOB 16

Slide 17

Slide 17 text

EARLY DAYS 17

Slide 18

Slide 18 text

DEVELOPING ALL FROM ONE PLACE > Xcode > Xcode+Toolchain > Docker+CLI+Editor 18

Slide 19

Slide 19 text

XCODE 19

Slide 20

Slide 20 text

XCODE+TOOLCHAIN 20

Slide 21

Slide 21 text

DOCKER+CLI+EDITOR $ brew install docker docker-machine $ docker-machine create --driver virtualbox default $ eval $(docker-machine env default) $ docker pull swiftdocker/swift $ docker run -it -v `pwd`:/project swiftdocker/swift bash --- root@445ab1838149 $ cd /project root@445ab1838149 $ swift build & swift test 21

Slide 22

Slide 22 text

SWIFT PACKAGE MANAGER The Swift Package Manager is a tool for managing the distribution of Swift code. It’s integrated with the Swift build system to automate the process of downloading, compiling, and linking dependencies. 22

Slide 23

Slide 23 text

USE SPM EVEN FOR SMALL OR PRIVATE PROJECTS! 23

Slide 24

Slide 24 text

THINGS YOU'D EXPECT TO WORK > dynamic keyword > Casting > Foundation > Grand Central Dispatch > Auto-importing of frameworks 24

Slide 25

Slide 25 text

CASTING HAS NEVER BEEN SO DIFFICULT... public func materialize(@autoclosure f: () throws -> T) -> Result { do { return .Success(try f()) - } catch { - return .Failure(error as NSError) + } catch let error as NSError { + return .Failure(error) } } From porting Result to Linux: https://github.com/antitypical/Result/pull/135 25

Slide 26

Slide 26 text

#IFS EVERYWHERE #if SWIFT_PACKAGE import SomeModuleOtherwiseAvailable #endif #if os(Linux) // some arcane hack #else // something more reasonable #endif 26

Slide 27

Slide 27 text

TESTING 27

Slide 28

Slide 28 text

! REDISCOVERING XCTEST ! import PackageDescription let package = Package( name: "MyPackage", targets: [ Target(name: "MyPackage"), Target(name: "MyPackageTests", // build tests as a regular target... dependencies: [.Target(name: "MyPackage")]), // ...that depend on the main one ], dependencies: [ #if !os(Linux) // XCTest is distributed with Swift releases on Linux .Package( // no version tags at apple/swift-corelibs-xctest, so fork it url: "https://github.com/username/swift-corelibs-xctest.git", majorVersion: 0 ), #endif ] ) 28

Slide 29

Slide 29 text

SPM TESTING Package.swift # can be empty in simplest configuration Sources/ MyPackage/ file.swift Tests/ LinuxMain.swift # needs `@testable import MyPackagetest` & `XCTMain()` MyPackage/ # *must* be named after package being tested test.swift # can `import XCTest` and `@testable import MyPackage` 29

Slide 30

Slide 30 text

MUCH SIMPLIFICATION 30

Slide 31

Slide 31 text

CONTINUOUS INTEGRATION 31

Slide 32

Slide 32 text

EMBRACE THE MATRIX 32

Slide 33

Slide 33 text

TRAVIS CI 33

Slide 34

Slide 34 text

TRAVIS CONFIGURATION matrix: include: - env: JOB=OSX_Xcode - env: JOB=OSX_SPM - env: JOB=Linux 34

Slide 35

Slide 35 text

TRAVIS XCODE script: xcodebuild test env: JOB=OSX_Xcode os: osx osx_image: xcode7.2 language: objective-c before_install: pod install / carthage update / etc. 35

Slide 36

Slide 36 text

TRAVIS OS X SPM script: - swift build - .build/Debug/MyUnitTests env: JOB=OSX_SPM os: osx osx_image: xcode7.2 language: objective-c before_install: - export SWIFT_VERSION=swift-DEVELOPMENT-SNAPSHOT-2016-02-25-a - curl -O https://swift.org/builds/development/xcode/$(SWIFT_VERSION)/$(SWIFT_VERSION)-osx.pkg - sudo installer -pkg $(SWIFT_VERSION)-osx.pkg -target / - export PATH=/Library/Developer/Toolchains/$(SWIFT_VERSION).xctoolchain/usr/bin:"${PATH}" 36

Slide 37

Slide 37 text

TRAVIS LINUX script: - swift build - .build/Debug/MyUnitTests env: JOB=Linux dist: trusty sudo: required language: generic before_install: - DIR="$(pwd)" - cd .. - export SWIFT_VERSION=swift-DEVELOPMENT-SNAPSHOT-2016-02-25-a - wget https://swift.org/builds/development/ubuntu1404/$SWIFT_VERSION/$SWIFT_VERSION-ubuntu14.04.tar.gz - tar xzf $SWIFT_VERSION-ubuntu14.04.tar.gz - export PATH="${PWD}/${SWIFT_VERSION}-ubuntu14.04/usr/bin:${PATH}" - cd "$DIR" 37

Slide 38

Slide 38 text

38

Slide 39

Slide 39 text

EARLY DAYS 39

Slide 40

Slide 40 text

Ϳ͜Θ͘Π͢;͜ THANK YOU! JP SIMARD – @SIMJP – TRY! SWIFT – TOKYO – MARCH 2, 2016 40