Tips about how to share UI/NSView subclasses between macOS/iOS projects effectively.
iOS / macOSCross Platform TipsKaz YoshikawaSwift2017 MayBUKURO x AKIBA Swift
View Slide
iOS / macOS Cross Platform Programming in Swift
Objective• Sharing code between iOS and macOS• UIView / NSView• UIViewController / NSViewController• NSColor / UIColor• NSImage / UIImage• etc…
Type AliasingJGPT J04JNQPSU6*,JUUZQFBMJBT97JFX6*7JFXUZQFBMJBT9*NBHF6**NBHFUZQFBMJBT9$PMPS6*$PMPSUZQFBMJBT94DSPMM7JFX6*4DSPMM7JFXUZQFBMJBT97JFX$POUSPMMFS6*7JFX$POUSPMMFSFMTFJGPT NBD04JNQPSU$PDPBUZQFBMJBT97JFX/47JFXUZQFBMJBT9*NBHF/4*NBHFUZQFBMJBT9$PMPS/4$PMPSUZQFBMJBT94DSPMM7JFX/44DSPMM7JFXUZQFBMJBT97JFX$POUSPMMFS/47JFX$POUSPMMFSFOEJG
Some DifferencesJ04MFUWJFX97JFX GSBNF$(3FDU Y Z XJEUI IFJHIUWJFXCBDLHSPVOE$PMPS9$PMPSCMVFOPFSSPSNBD04MFUWJFX97JFX GSBNF$(3FDU Y Z XJEUI IFJHIUWJFXCBDLHSPVOE$PMPS9$PMPSCMVF7BMVFPGUZQF97JFXIBTOPNFNCFSCBDLHSPVOE$PMPS
Filling the DifferencesFYUFOTJPO97JFX\ 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 ^
No errorJ04MFUWJFX97JFX GSBNF$(3FDU Y Z XJEUI IFJHIUWJFXCBDLHSPVOE$PMPS9$PMPSCMVFOPFSSPSNBD04MFUWJFX97JFX GSBNF$(3FDU Y Z XJEUI IFJHIUWJFXCBDLHSPVOE$PMPS9$PMPSCMVFOPFSSPS
Subclassing X• Storyboard for both iOS / macOSDMBTT.Z7JFX97JFX\ PWFSSJEFGVODESBX @SFDU$(3FDU\ 9$PMPSSFETFU 9#F[JFS1BUI PWBM*OSFDUGJMM ^^
Use #if where appropriateDMBTT.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 ^
Wrap a functionGVOD93FDU'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 ^^
Use typealias for DelegatesJGPT J04UZQFBMJBT94DSPMM7JFX%FMFHBUF6*4DSPMM7JFX%FMFHBUFFMTFJGPT NBD04QSPUPDPM94DSPMM7JFX%FMFHBUF\^FOEJGDMBTT.Z7JFX$POUSPMMFS97JFX$POUSPMMFS 94DSPMM7JFX%FMFHBUF\ !*#0VUMFUXFBLWBSTDSPMM7JFX94DSPMM7JFX JGPT J04 GVODTDSPMM7JFX%JE4DSPMM @TDSPMM7JFX6*4DSPMM7JFX\ ^ FOEJG^
Still so manydifferences
NS/UIViewmethods iOS macOSGVODBEE4VCWJFX ⭕ ⭕GVODCSJOH4VCWJFX ⭕ ❌GVODTFOE4VCWJFX ⭕ ❌GVODJOTFSU4VCWJFX ⭕ ❌GVODFYDIBOHF4VCWJFX ⭕ ❌GVODEJE"EE4VCWJFX ⭕ ⭕
NS/UIBezierPathiOS macOSGVODNPWF GVODNPWF GVODBEE-JOF func line()GVODBEE$VSWF func curve()GVODBEE2VBE$VSWF ❌WBSDH1BUI$(1BUI ❌
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 fordelegates and other protocols• Share your bridging code
gist: codelynx/XPlatform.swift
Kaz YoshikawaMay the Swift be with you….
Thank you