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