Slide 1

Slide 1 text

iOS / macOS Cross Platform Tips Kaz Yoshikawa Swift 2017 May BUKURO x AKIBA Swift

Slide 2

Slide 2 text

iOS / macOS 
 Cross Platform
 Programming in Swift

Slide 3

Slide 3 text

Objective • Sharing code between iOS and macOS • UIView / NSView • UIViewController / NSViewController • NSColor / UIColor • NSImage / UIImage • etc…

Slide 4

Slide 4 text

Type Aliasing JGPT J04  JNQPSU6*,JU UZQFBMJBT97JFX6*7JFX UZQFBMJBT9*NBHF6**NBHF UZQFBMJBT9$PMPS6*$PMPS UZQFBMJBT94DSPMM7JFX6*4DSPMM7JFX UZQFBMJBT97JFX$POUSPMMFS6*7JFX$POUSPMMFS FMTFJGPT NBD04  JNQPSU$PDPB UZQFBMJBT97JFX/47JFX UZQFBMJBT9*NBHF/4*NBHF UZQFBMJBT9$PMPS/4$PMPS UZQFBMJBT94DSPMM7JFX/44DSPMM7JFX UZQFBMJBT97JFX$POUSPMMFS/47JFX$POUSPMMFS FOEJG

Slide 5

Slide 5 text

Some Differences J04 MFUWJFX97JFX GSBNF$(3FDU Y Z XJEUI IFJHIU  WJFXCBDLHSPVOE$PMPS9$PMPSCMVFOPFSSPS NBD04 MFUWJFX97JFX GSBNF$(3FDU Y Z XJEUI IFJHIU  WJFXCBDLHSPVOE$PMPS9$PMPSCMVF7BMVFPGUZQF97JFXIBTOPNFNCFS CBDLHSPVOE$PMPS

Slide 6

Slide 6 text

Filling the Differences FYUFOTJPO97JFX\  JGPT NBD04   WBSCBDLHSPVOE$PMPS/4$PMPS \   HFU\    HVBSEMFUCBDLHSPVOE$PMPSTFMGMBZFS CBDLHSPVOE$PMPS
       FMTF\SFUVSOOJM^    SFUVSO/4$PMPS DH$PMPSCBDLHSPVOE$PMPS    ^   TFU\    TFMGXBOUT-BZFSUSVF    TFMGMBZFS CBDLHSPVOE$PMPSOFX7BMVF DH$PMPS   ^  ^  FOEJG   ^

Slide 7

Slide 7 text

No error J04 MFUWJFX97JFX GSBNF$(3FDU Y Z XJEUI IFJHIU  WJFXCBDLHSPVOE$PMPS9$PMPSCMVFOPFSSPS NBD04 MFUWJFX97JFX GSBNF$(3FDU Y Z XJEUI IFJHIU  WJFXCBDLHSPVOE$PMPS9$PMPSCMVFOPFSSPS

Slide 8

Slide 8 text

Subclassing X • Storyboard for both iOS / macOS DMBTT.Z7JFX97JFX\  PWFSSJEFGVODESBX @SFDU$(3FDU \   9$PMPSSFETFU    9#F[JFS1BUI PWBM*OSFDU GJMM   ^ ^

Slide 9

Slide 9 text

Use #if where appropriate DMBTT.Z7JFX$POUSPMMFS97JFX$POUSPMMFS\  JGPT J04   !*#0VUMFUXFBLWBSQJODI(FTUVSF6*1JODI(FTUVSF3FDPHOJ[FS  !*#0VUMFUXFBLWBSUBQ(FTUVSF6*5BQ(FTUVSF3FDPHOJ[FS  FMTFJGPT NBD04   !*#0VUMFUXFBLWBSNBHOJGZ(FTUVSF/4.BHOJGJDBUJPO(FTUVSF3FDPHOJ[FS  !*#0VUMFUXFBLWBSDMJDL(FTUVSF/4$MJDL(FTUVSF3FDPHOJ[FS  FOEJG   ^

Slide 10

Slide 10 text

Wrap a function GVOD93FDU'JMM @SFDU$(3FDU \  JGPT J04   6*3FDU'JMM SFDU   FMTFJGPT NBD04   /43FDU'JMM SFDU   FOEJG ^ DMBTT.Z7JFX97JFX\  PWFSSJEFGVODESBX @SFDU$(3FDU \   9$PMPSSFETFU    93FDU'JMM SFDU   ^ ^

Slide 11

Slide 11 text

Use typealias for Delegates JGPT J04  UZQFBMJBT94DSPMM7JFX%FMFHBUF6*4DSPMM7JFX%FMFHBUF FMTFJGPT NBD04  QSPUPDPM94DSPMM7JFX%FMFHBUF\^ FOEJG DMBTT.Z7JFX$POUSPMMFS97JFX$POUSPMMFS 94DSPMM7JFX%FMFHBUF\  !*#0VUMFUXFBLWBSTDSPMM7JFX94DSPMM7JFX  JGPT J04   GVODTDSPMM7JFX%JE4DSPMM @TDSPMM7JFX6*4DSPMM7JFX \     ^  FOEJG ^

Slide 12

Slide 12 text

Still so many differences

Slide 13

Slide 13 text

NS/UIView methods iOS macOS GVODBEE4VCWJFX ⭕ ⭕ GVODCSJOH4VCWJFX ⭕ ❌ GVODTFOE4VCWJFX ⭕ ❌ GVODJOTFSU4VCWJFX ⭕ ❌ GVODFYDIBOHF4VCWJFX ⭕ ❌ GVODEJE"EE4VCWJFX ⭕ ⭕

Slide 14

Slide 14 text

NS/UIBezierPath iOS macOS GVODNPWF GVODNPWF GVODBEE-JOF func line() GVODBEE$VSWF func curve() GVODBEE2VBE$VSWF ❌ WBSDH1BUI$(1BUI ❌

Slide 15

Slide 15 text

Rule of Thumb • Use typealias to bind NS/UI Classes • Use #if to write platform specific code • Wrap NS/UI function • Use typealias or fake protocol to trick compiler for delegates and other protocols • Share your bridging code

Slide 16

Slide 16 text

gist: codelynx/ XPlatform.swift

Slide 17

Slide 17 text

Kaz Yoshikawa May the Swift be with you….

Slide 18

Slide 18 text

Thank you