Xamarin Advent Calendar 2019 24æ¥ç®ã®ã¨ã³ããªã¼ã§ãããã£ãªãã¨çãã¦ãã®?ã£ã¦æãã§ããã軽ãã®ãã¿ã»èª¿ã¹ç©ã§åæ¦ã§ãã
ç®æ¬¡
- what is it?
- ä»ä½¿ããã®?
- ã©ããªãã¤ã³ãã£ã³ã°ãåºæ¥ãã®?
- swiftã©ã¤ãã©ãªã®ã¡ã¿ãã¼ã¿æ§ç¯
- ç¬èªswiftcæ¡å¼µ
- ã©ããã¼swiftã©ã¤ãã©ãªã®çæ
- C#ãã¤ã³ãã£ã³ã°çæ
- BTFSã®å¶é
- ã¾ã¨ã
what is it?
2019å¹´ã¯Xamarinæ¹é¢ã§ã¯è½ã¡çãã1å¹´ã«ãªã£ã¦ãããã¨æãã¾ãããã¤ãã£ãã»ãã©ãããã©ã¼ã å´ã¯Jetpack ComposeãSwiftUIãçºè¡¨ãããããããæ°ããæ代ãå§ã¾ããã¨ãã¦ãã¾ãããXamarinã¯ç¬èªã®ã¯ã©ã·ãã¯ãªã¨ã³ã·ã¹ãã ã«ç«èããã ãã§ç¶ãã¦ããã®ããæ°ããæ³¢ã«ãã¡ãã¨ä¹ã£ã¦ãããã®ããæ¥å¹´ã¯åããè¦ãã¦ããã¹ã1å¹´ãªã®ã ãããªã¨æãã¾ãã
Xamarin.Androidæ¹é¢ã§ã¯binding generatorããKotlin artifactãåãé¤ããããAndroidSupportComponentsããAndroidXãµãã¼ããåãåºãããªãã¸ããªãåºç¾ãããªã©ã®é²å±ã¯è¦ããã¾ãããããã以ä¸ã«å¤§ããªåãã¯ç¡ãããã§ããã¾ãéå±ã¨è¨ãã°éå±ã§ããã
ä¸æ¹ã§ãä»å¹´å ¬éãããä¸ã§ãããããã³ããã«é¢ç½ããã ã¨æã£ãã®ã¯ãxamarin-maciosæ¹é¢ã§ä»å¹´ã®ç§é ã«å ¬éããããããbinding-tools-for-swiftã§ãã
ããã¾ã§ãtom-swiftyããSwiftNetifierãããããããªååã§éçºããã¦ããSwiftã¨C#ã®ç¸äºéç¨ã®ããã®ãã¼ã«ããã¤ãã«å ¬éãããã¨ãããã¨ã§ãããtom-swiftyã®ååã¯ãã¼ã«åã¨ãã¦ãæ®ã£ã¦ããã¿ããã§ããï¼Tom Swiftyã¨ããåèªã¯Wikipediaã«ãé ç®ããããããä¸è¬çã§ããããã§ãï¼ã
binding-tools-for-swiftã«é¢ããå ¬å¼ãªãã¸ããªä»¥å¤ã®æ å ±ã¯ç¾ç¶ã»ã¼çç¡ã§ãããXamarinã§éçºãæ å½ãã¦ããã¡ã³ãã¼ï¼ããããããããããªããªã£ã¦ããå ¥ã£ã¦ãã人ã¿ããï¼ãå°å ¥çãªããã°ãã¹ããã¾ã¨ãã¦ãã¾ãã
ç¾å¨è£½ååããã¦ããXamarin.iOSã¨Xamarin.Macã¯Objective-Cã®APIã«å¯¾å¿ãããã¤ã³ãã£ã³ã°ã¨ãã¤ã³ãã£ã³ã°çææ©æ§ããObjCRuntimeãçµç±ãã¦å®ç¾ãããã®ã§ãããSwiftã®å ´åã¯ã©ã³ã¿ã¤ã ãå«ããã¾ãã¾ãªç¬èªè¦ç´ ãå«ã¾ãã¦ããã®ã§ãæ°ãããã¤ã³ãã£ã³ã°çæãã¼ã«ãå¿ è¦ã¨ããã¦ãã¾ããã
Swiftèªä½ã¯ããä½å¹´ãåããåå¨ããè¨èªãªã®ã§ãä»ããã¨æãããããããã¾ããããä¸è¬çãªè©ä¾¡ã¨ãã¦ãSwiftã®è¨èªä»æ§ãå®å®ãã¦ããã®ã¯Swift3ã4ãããã®æ¯è¼çæè¿ã®ãã¨ã§ãããè¨èªæ©è½ã¯Objective-Cãããè¤éã§ãããã«ABIå®å®æ§ãSwift4ã§ããããç®æ¨ã¨ãªã£ããããªæ®µéãªã®ã§*1ããã¤ã³ãã£ã³ã°ãã¼ã«ã«é¢ãã¦ã¯ãããããæ¬è °ãå ¥ãã¦åãããããç¶æ ã«ãªã£ãã¨ãè¨ãã¾ããï¼ABIä¸å®å®ãªã¨ãã«ãã£ã¤ãå®è£ ãã¦ãæ°ãã¼ã¸ã§ã³ã®Swiftã§å°ç¡ãã«ãªã£ããæ®å¿µãªãã¨ã«ãªãã®ã§â¦ï¼
ãããã¯Appleã¦ã¼ã¶ã¼ã¨ã¯è¨ããããã§ããããã¾ã§è©¦ãããã¨ãç¡ãã£ãã®ã§ãããä»åã¯ãã®binding-tools-for-swiftãã©ããã£ã¦ä½¿ãã®ããä½ãé¢ç½ãã®ãã¨ãã£ã話ãæ¸ãã¾ãã
binding-tools-for-swiftã¨ããååã¯é·ãã®ã§ã以éå ¬å¼ããã¥ã¡ã³ãã®æ £è¡ã«æºãã¦BTFSã¨è¡¨è¨ãã¾ãã
ä»ä½¿ããã®?
BTFSã¯ã¾ã èããéçºä¸ã§ããããã大æ¦ã®ã©ã¤ãã©ãªã¯ãã¤ã³ãã«å¤±æããã®ã§ã¯ãªããã¨æãã¾ããä»æ§ã¨ãã¦ãã¤ã³ãã£ã³ã°ä½æãé£ããï¼Xamarin.Androidã®ããã«ãè¨èªéã®éããå¸åãã¦å®å ¨èªåã§ãã¤ã³ãããã®ãããã£ãã¯ã»ããªã¹ã«ããåºæ¥ãªãï¼ã¨ããã以åã«ããããããã¼ã«ãã§ã¤ã³ãæ´ã£ã¦ããªãã¨ããã¨ã©ã¼ãã°ãã¾ã¨ãã«åºåãããªããã¨ãã£ãã¬ãã«ã®ç¶æ ãªã®ã§ãããããå¤é¨ã®éçºè ã¯ããå°ãæ´åãããã®ãå¾ ã£ãã»ããããããã§ãã
BTFSã®ãã«ãæé ã¯ããããã£ã¬ã¯ããªã§make
ãå®è¡ããã ããªã®ã§ãããç¾ç¶ã§ã¯ãxamarin-maciosããã«ãããã®ã¨åæ§ã«ãç¹å®ã®ãã¼ã¸ã§ã³ã®XcodeãmonoãXamarin.iOSãXamarin.Macã®ãã¦ã³ãã¼ããå¿
è¦ã«ãªãã¾ãï¼Xamarinãã©ãããã©ã¼ã ã¯masterã§ãå¯è½ããã§ãããããããBTFSéçºè
åãã§ãï¼ãXcodeã ãã§ã15GBãããã¯å¿
è¦ã«ãªãã®ã§ã¹ãã¬ã¼ã¸ã«ä½è£ã®ç¡ã人ã¯è©¦ããªãã¨æãã¾ããä¸è¶³ã³ã³ãã¼ãã³ãããã¦ã³ãã¼ãããããã®jenkinsã¹ã¯ãªããã®ã³ãã³ããªã©ã示ãã¦ãããã®ã§ãããã«å¾ã£ã¦ããã°ããããã«ãã§ããã§ãããï¼é©å½ï¼ã
ãã£ãããã«ãã§ããããmono tom-swifty/bin/Debug/tom-swifty.exe --help
ãå®è¡ãã¦ç¢ºèªãã¦ã¿ãã¨ããã§ãããã
å®éã«ã©ã¤ãã©ãªããã¤ã³ãããã¨ãã¯ãquickstart guideã«ããã以ä¸ã®ã³ãã³ããå®è¡ãããã¨ã«ãªãã¾ãã
mono /path/to/tom-swifty.exe --swift-bin-path SWIFT_BIN_PATH --swift-lib-path SWIFT_LIB_PATH -o /path/to/output_directory -C /path/to/YOURLIBRARY.framework -C /path/to/binding-tools-for-swift/swiftglue/bin/Debug/PLATFORM/XamGlue.framework -module-name YOURLIBRARY
SWIFT_BIN_PATH
ã¨SWIFT_LIB_PATH
ã«ã¯ä»¥ä¸ã®ãããªãã¹ãæå®ãããã¨ã«ãªãã¾ããBTFSç¨ã«æãå ããããç¬èªã®swiftã³ã³ãã¤ã©ãå¿
è¦ã«ãªãã¾ãã
/path/to/binding-tools-for-swift/SwiftToolchain-v3/GITHASH/build/Ninja-ReleaseAssert/swift-macosx-x86_64/bin /path/to/binding-tools-for-swift/SwiftToolchain-v3/GITHASH/build/Ninja-ReleaseAssert/swift-macosx-x86_64/lib
ãããã¯BTFSããã«ããã¦ã³ãã³ãã©ã¤ã³ã§å®è¡ã§ããã¨ããã¾ã§ã¯é²ãã¾ãããããã¤ã³ãåºæ¥ãã©ã¤ãã©ãªã¯ç¹ã«è¦ã¤ãããã¾ããã§ãããAudioKitãããã¯ãã¤ã³ãã£ã³ã°ããã£ã¦ãããããããªãããªã¼ã¨æã£ãã®ã§ãããframework以ä¸ã®å®è¡ãã¡ã¤ã«ã¸ã®ã·ã³ããªãã¯ãªã³ã¯ãèªããªãã¬ãã«ã®å®æ度ã§ããã
ä¸è¬ã¦ã¼ã¶ã¼ã®ã¨ããã«éã£ã¦ããã¾ã§ã«ã¯ãMSBuildã¿ã¹ã¯ãªã©ãå®æãã¦MSBuildãVS{Mac, Win}ããå¼ã³åºãããNuGetã§åã£ã¦ããããããã«ãªã£ãããã¦ããã¨æãã¾ãã
ã¨ãããããä»ã¾ã 使ããªãã¨ãã¦ããBTFSãã©ããªå·¥ç¨ãçµã¦ã¦ã¼ã¶ã¼ã®ã©ã¤ãã©ãªã«å¯¾ãããã¤ã³ãã£ã³ã°ãçæããã®ããã¨ããé¨åã¯å®è£ ã®ã¹ãã¼ã¿ã¹ã¨ã¯å¥ã«é¢ç½ã話ã«ãªãã¨æãã®ã§ããã®ã¨ã³ããªã®ä»¥éã®å 容ã¯Functional Outlineã®ããã¥ã¡ã³ãã§èª¬æããã¦ãããã«ãããã»ã¹ã«ã¤ãã¦ãä»ã®ããã¥ã¡ã³ãã«ãè¨åãã¤ã¤èª¬æãã¦ããã¾ãã
ã©ããªãã¤ã³ãã£ã³ã°ãåºæ¥ãã®?
BTFSã§ã¯ã以ä¸ã®è¨èªè¦ç´ ããµãã¼ãããã¦ãã¾ãã
- ã¯ã©ã¹
- æ§é ä½
- åæå
- é¢é£å(associatedtype)ã®ç¡ããããã³ã«
- ãããã¬ãã«ã®é¢æ°ã¨å¤æ°
- ã¸ã§ããªãã¯ãªã¯ã©ã¹ã»æ§é ä½ã»åæå
- escapingãªã¯ãã¼ã¸ã£ã¼
- @ObjCãªå
- évirtualã¡ã½ããã«ããããããã³ã«åæå(composition types)
- ä¾å¤
- æ¡å¼µ(extensions)
ãµãã¼ãããã¦ããªãã®ã¯âã®ãããªè¦ç´ ã§ãã
- é¢é£åã®ãããããã³ã«
- noescapeãªã¯ãã¼ã¸ã£ã¼
- ã¯ãã¼ã¸ã£ã¼ã«ããã¸ã§ããªãã¯ã¤ã³ã¹ã¿ã³ã¹(bound generic types with closures) ï¼ãã¶ãæå³ã¨ãã¦ã¯ãã®è¨³ã§åã£ã¦ããã¨æããã©åéããããããï¼
ObjectModelingã®ããã¥ã¡ã³ãã«ããããã®æ§é ãæ¸ããã¦ãã¾ããï¼ã¡ãã£ã¨é·ãã®ã§ããã§ã¯å¼ç¨ãã¾ããï¼ãISwiftObject
ã¨ããã¤ã³ã¿ã¼ãã§ã¼ã¹ãå®è£
ãããªãã¸ã§ã¯ãã¨ãªãããã§ããXamarin.Androidã«ãããIJavaObject
ã¿ãããªãã®ã§ããããï¼XAã®å ´åã¯ãIJavaObject
èªä½ã¯åãªãJavaãªãã¸ã§ã¯ãã®ãã¼ã«ã¼ã§ãããªããå¿
ãJava.Lang.Objectã¯ã©ã¹ããæ´¾çãããã¨ã«ãªãã¾ãããï¼
Objective-Cã®ã¨ãããããã³ã«ã¯ã¹ãã¬ã¼ãã«C#ã«ãããã³ã°åºæ¥ãªãåå¨ã§ããããSwiftã®ãããã³ã«ã¸ã®ãã¤ã³ãã£ã³ã°ãããè¤éãªèª¬æãè¦ããåå¨ã«ãªã£ã¦ãã¾ããProtocol Handlingã®ããã¥ã¡ã³ãã§è©³ããã¾ã¨ãããã¦ãã¾ãããEveryProtocol
ã¨ããä½ããç¥ã£ã½ãã¯ã©ã¹(!?)ãå®ç¾©ãã¦ãããã渡ãã¦å»»ãããã§ãã
swiftã©ã¤ãã©ãªã®ã¡ã¿ãã¼ã¿æ§ç¯
Swiftã®ã©ã¤ãã©ãªãã½ã¼ã¹ãããã«ãããã¨ãswiftmoduleã¨ããã©ã¤ãã©ãªã®ã¡ã¿ãã¼ã¿ãæ ¼ç´ãããã¡ã¤ã«ããSILã¨å¼ã°ããä¸é表ç¾ã®ãã¤ããªãã¡ã¤ã«ã«ãªãã¾ããBTFSã§ã¯ãããã対象ã«ãã¤ã³ãã£ã³ã°ã®å
ã«ãªãSwiftType
ã¨ããåæ
å ±ãæ§ç¯ãã¦ããã¾ããæçµçã«SwiftType
ãéãããã®ã¯Inventory
ã¨å¼ã°ããã¡ã¿ãã¼ã¿ã®éåä½ã«ãªãã次ã®ãã«ãããã»ã¹ã§ããã¨ããã®ãã©ããã³ã°ãã®å
¥åã«ãªãã¾ãã
ãã£ã¨ãããã®ã¢ããã¼ãã§ã¯ååãªåæ å ±ãå¾ããã¨ãã§ããªãã®ã§ã次ã«XML relectionã¨ãã解æããã»ã¹ãçµã¦åæ å ±ãå®æããã¾ãã
ã¡ãªã¿ã«ããããã®éç¨ã§ã¯swiftã®ã©ã¤ãã©ãªã®ãã¤ããªããèå¥åãåå¾ããå¿ è¦ãããã®ã§ãããswiftã³ã³ãã¤ã©ã¯swiftã®èå¥åããã¤ããªã³ã¼ãã¨ãã¦ãã©ãããã©ã¼ã æºæ ã®å½¢å¼ã«ããããã«manglingã¨ããå å·¥å¦çãè¡ãã¾ãï¼C++ã³ã³ãã¤ã©ãªã©ã§ãè¡ããã¦ãã¾ãï¼ãBTFSã«ã¯ããã解æããDemanglerã¨ããã³ã³ãã¼ãã³ããå«ã¾ãã¦ãã¾ãã
ç¬èªswiftcæ¡å¼µ
BTFSã®ããã¥ã¡ã³ãã«ããã¨ãswiftcãçæããswiftmoduleãã©ã¤ãã©ãªãã¡ã¤ã«ã«ã¯ããã¤ã³ãã£ã³ã°ã®çæã«å¿ è¦ã¨ãªãåæ å ±ãååã«ã¯å«ã¾ãã¦ããªããããXamarinã§ç¬èªã«swiftcã«æãå ãã(?)ã³ã³ãã¤ã©ããã«ãããããã§ããXML reflectionã®éç¨ã§ä½¿ç¨ãããã®ã¯ãã®ã¹ã¯ãªããã§ãã«ããããâ¦ãããããªãâ¦ã³ã³ãã¤ã©ã§ããï¼é常ã¯ãã«ãæ¸ãã¤ããªã®ãã¦ã³ãã¼ããèµ°ãã ãã«ãªãããï¼
https://github.com/xamarin/binding-tools-for-swift/blob/master/jenkins/build-swift.sh
XmlReflectionã®ããã¥ã¡ã³ããçºãã¦ã¿ãã¨ãæ¢åã®swiftcã«æãå ããã¨ããããã¯ããããèªåã§swiftã³ã³ãã¤ã©ãä½ãã¿ãããªå£®å¤§ãª(?)話ãæ¸ããã¦ãã¾ããã¾ããã¼ãµãä½ã£ã¦XMLã§ã¡ã¿ãã¼ã¿ãçæããã ããªã®ã§ããã»ã©éç¾å®çã§ããªãããâ¦? ããããXamarin.Androidã®ãã«ãç¨ã§Javaã¹ã¿ãã³ã¼ãã®ãã¼ãµã¼æ¸ããããã¾ãããï¼ãã¶ãä»ã§ã使ããã¦ããã¯ãâ¦?ï¼
ã¨ãããããã®Xml reflectionã®ã¢ã¦ããããã¯Module Declarationã¨å¼ã°ããããã次ã®ãã«ãããã»ã¹ã§ããã©ããã¼çæå¦çã¸ã®å ¥åã¨ãªãã¾ãã
ã©ããã¼swiftã©ã¤ãã©ãªã®çæ
Inventoryã¨Module Definitionã¨ãã2ã¤ã®é¡ä¼¼ããã¡ã¿ãã¼ã¿éåãåºæ¥ä¸ãã£ããã次ã¯ãããããã¨ã«ãããããã¤ã³ãã£ã³ã°ãçæâ¦ã¨ããããã«ã¯ããã¾ããã ã¦ã¼ã¶ã¼ã®swift APIãããã£ããC#ã®P/Invokeã§å¼ã³åºããã¹ã¿ã¤ã«ã®APIã§ã©ããããswiftã³ã¼ããçæãã¾ãããã®éç¨ã¯WrappingBuilderã¨ããé¨åãå®ç¾ãã¦ãã¾ãã
BTFSã®ä¸ã§ãã¡ã¿ãã¼ã¿æ å ±ã解æãã¦åããªã¼æ å ±ãæ§ç¯ããã®ã¯Dynamoã¨å¼ã°ãã¦ãã¾ãããã®BTFSãããswiftã³ã¼ããçæããããå¾ã§C#ã³ã¼ããçæããããããã¨ã«ãªãã¾ãã
ã©ããã¼çæå¦çã¯ãå®éã«ã¯2ã¤ã®ã¦ã¼ãã£ãªãã£ã§è¡ããã¦ãã¾ããWrappingBuilderãåºæ¬çãªã¯ã©ã¹æ§é ãå®ç¾©ãã¦ãããã²ã¨ã¤OverrideBuilderã¨ããé¨åããC#ã§openã¯ã©ã¹ãæ´¾çã§ããããã«å¿ è¦ã«ãªãæ´¾çã¯ã©ã¹ãçæãã¾ããXamarin.Androidã«ãgen-java-stubs.exeã¨ãGenerateJavaStubsã¨ããMSBuildã¿ã¹ã¯ãããã®ã§ãããããã«ç¸å½ãããã®ã¨èãã¦ããããã§ãã
C#ãã¤ã³ãã£ã³ã°çæ
ã©ããã¼ãæºåãã¦APIã¡ã¿ãã¼ã¿ãæ´å°ããã¨ããã§ãããããC#ãã¤ã³ãã£ã³ã°ã®çæã«å
¥ããã¨ãåºæ¥ã¾ããã¾ããã©ããã¼ã®ã©ã¤ãã©ãªãããåã³SwiftType
ã®Inventoryã¨reflectorã«ããModule Declarationã®2ã¤ã®ã¡ã¿ãã¼ã¿éåãçæãã¾ãï¼å¦çå
容ã¯æåã¨åãã§ãã対象ãã©ããã¼ã«ãªã£ãã ãã§ãï¼ãããã§ã¾ãDemanglerãå¿
è¦ã«ãªãã¾ãã
C#ã®ã³ã¼ããçæããã®ã¯ãã©ããã¼ãçæããæã«ç»å ´ããDynamoã®å½¹å²ã§ããããã§ããããå®æã§ã!
BTFSã®å¶é
BTFSããµãã¼ããã¦ããã®ã¯Swift 5ã¾ã§ã®ææ³ã§ãSwift 5.1ã¯ãµãã¼ããã¦ãã¾ãããSwiftUIãå¤å¤§ã«ä¾åãã¦ããOpaque Result Typesãªã©ã¯ã¾ã 使ããªãã¨ãããã¨ã§ããã
ã¾ã¨ã
ä»åã¯Xamarin/binding-tools-for-swiftã§è¡ããã¦ãããã¤ã³ãã£ã³ã°ã®ãã«ãéç¨ã追ã£ã¦ã¿ã¾ãããéä¸ã§ç¬èªã®swiftã³ã³ãã¤ã©ããã¯ãå ãã¦ãããã¨ãé常ã«ããããããèãæè¡ã使ããã¦ããã®ã§ã¯ãªãã§ããããã
*1:ãã¨ãã°ãã®swiftã®name manglingã«é¢ããããã¥ã¡ã³ããè¦ãã¨4.0ã¨4.2ã§éã£ã¦ãããã¨ããããã¾ã