Appleã¯ã
ãObjective-Cãã¢ããªã±ãŒã·ã§ã³å
ã§
ãSwiftãã³ãŒãã䜿çšããæ¹æ³ïŒããã³ãã®éïŒã«ã€ããŠäžèŠè©³çްãª
ããã¥ã¡ã³ããäœæããŸããããäœããã®çç±ã§ããã§ã¯äžååã§ãã ãSwiftãã§å®å
šã«èšè¿°ããã
ãã¬ãŒã ã¯ãŒã¯ããObjective-Cãã¢ããªã±ãŒã·ã§ã³ãšäºææ§ãããããšã確èªããå¿
èŠæ§ãæåã«æãããšããäœããã®çç±ã§
ã¢ããã«ã®ããã¥ã¡ã³ããçããããå€ãã®è³ªåãæèµ·ããŸããïŒãŸããå°ãªããšãå€ãã®ã¹ããŒã¹ãæ®ããŸããïŒ ã æ€çŽ¢ãšã³ãžã³ã®éäžçãªäœ¿çšã«ããããã®ãããã¯ã¯Webã§ããªãäžååã«ããã«ããŒãããŠããªãããšãããããŸãã
ãStackOverflowã«é¢ããããã€ãã®è³ªåãïŒãã¡ããè±èªã®ãªãœãŒã¹
ã«é¢ãã ïŒããã€ãã®
å
¥éèšäº -çºèŠããããã¹ãŠã§ãã
ãã®èšäºã¯ãåŸãããæ
å ±ãšåŸãããçµéšãäžè¬åãããã®ã§ãã 圌ããèšãããã«ãããã¯è¯ãç¿æ
£ãšåŒã°ãããµããããã®ã§ã¯ãªããèšè¿°ãããç¶æ³ã§å¯èœãªè¡åã瀺åããããŸãã¯äžçš®ã®åŠè¡å®éšã§ãããšåŒ·èª¿ããŸãã
æçµæŽæ°æ¥ïŒ2019幎2æTL; DRã ãObjective-Cãå
ã§ãSwiftãã³ãŒãã䜿çšããã«ã¯ããSwiftãã®ãæ©èœããããã€ãæŸæ£ãããObjective-Cãã¡ãœãããšäºææ§ã®ãªãã³ãŒãïŒ ãstructuresã ã ãgenericsã ã ãåæå€ã ã ããããã³ã«æ¡åŒµããªã©ïŒã NSObject
åŸç¶ NSObject
åºã¥ããŸãã
éå§ãã
ãã®ããããObjective-Cããããžã§ã¯ããšããã®ãããžã§ã¯ãã§äœ¿çšããããã€ãã®Swiftã³ãŒãããããŸãã ããšãã°ã
ãCocoaPodsãã䜿çšããŠããããžã§ã¯ãã«è¿œå ãããµãŒãããŒãã£ã®ãSwiftããã¬ãŒã ã¯ãŒã¯ãšããŸãã éåžžã©ããã
ãPodfileãã«å¿
èŠãªäŸåé¢ä¿ã远å ãã
pod install
å®è¡ãã
ãxcworkspaceããã¡ã€ã«ãéã
ãŸã ã
ãã¬ãŒã ã¯ãŒã¯ããObjective-Cããã¡ã€ã«ã«
import
ããããã«ããSwiftãã§è¡ã£ãããã«ãã¬ãŒã ã¯ãŒã¯å
šäœã®
import
ãç»é²ããå¿
èŠã¯ãããŸããããObjective-Cãã§è¡ã£ãããã«ããããªãã¯ãã¬ãŒã ã¯ãŒã¯
APIã®åã
ã®ãã¡ã€ã«ãã€ã³ããŒãããããšããŸãã ãã¬ãŒã ã¯ãŒã¯æ©èœãžã®ã¢ã¯ã»ã¹ãå¿
èŠãªãã¡ã€ã«ã§ã¯ã
<>-Swift.h
ãšãããã¡ã€ã«ãã€ã³ããŒãããŸããããã¯ããObjective-Cããã¡ã€ã«ã®ã³ã³ãã¯ã¿ãŒã§ãããObjective-Cããã¡ã€ã«ã®ã³ã³ãã¯ã¿ãŒã§ããèªåçæããããŒãã¡ã€ã«ã§ããã€ã³ããŒããããSwiftãã¡ã€ã«ã 次ã®ããã«ãªããŸãã
#import "YourProjectName-Swift.h"
Objective-Cãã¡ã€ã«ã§ã®Swiftã¯ã©ã¹ã®äœ¿çš
ãSwiftãããããŒãã€ã³ããŒãããåŸããObjective-Cããããžã§ã¯ãã§ã¯ã©ã¹ãŸãã¯ã¡ãœãããç°¡åã«äœ¿çšã§ããå Žåãéåžžã«å¹žéã§ã-誰ããããªãã®åã«äºææ§ã®é¢åãèŠããšããããšã§ãã å®éã«ã¯ããObjective-Cãã¯
NSObject
ã®äžäœã¯ã©ã¹ã®ã¿ãããã€ãžã§ã¹ãããã
ãããªãã¯ãª ãAPIãã®ã¿ã衚瀺ããŸãã ãŸããã¯ã©ã¹å
ã§ã¯ãå¿
èŠãªãããªãã¯
ãããã㣠ã
åæååãããã³
ã¡ãœããã« @objc
ã§æ³šéãä»ããå¿
èŠããããŸãã
ç¬èªã®ãSwiftãã³ãŒããã€ã³ããŒãããå Žåããã¡ãããããããäœãããç¶æ¿ãããŠ
@objc
ã¢ãããŒã·ã§ã³ïŒãŸãã¯å±æ§ïŒã远å ããæ©äŒããã
ãŸã ã ãããããã®å ŽåãããããããObjective-Cãã§èšè¿°ããæ©äŒãšå¿
èŠãªã³ãŒãããããŸãã ãããã£ãŠãä»ã®èª°ãã®ãSwiftãã³ãŒãããããžã§ã¯ãã«ã€ã³ããŒãããå Žåã«çŠç¹ãåœãŠãæ¹ãçã«ããªã£ãŠããŸãã ãã®å Žåãã»ãšãã©ã®å Žåãå¿
èŠãªã¯ã©ã¹ãŸãã¯ãã®ä»ã«ç¶æ¿ã远å ããæ©äŒããããŸããã ãã®å Žåã®å¯ŸåŠæ¹æ³
ã©ãããŒãæžãããšã¯æ®ã£ãŠããŸãïŒ
ã€ã³ããŒãããããã¬ãŒã ã¯ãŒã¯ã«å¿
èŠãªæ¬¡ã®ã¯ã©ã¹ãå«ãŸããŠãããšä»®å®ããŸãã
public class SwiftClass { public func swiftMethod() {
ç¬èªã®ãSwiftããã¡ã€ã«ãäœæããå€éšãã¬ãŒã ã¯ãŒã¯ããã®ãã¡ã€ã«ã«ã€ã³ããŒããã
NSObject
ããç¶æ¿ããç¬èªã®ã¯ã©ã¹ãäœæãããã®äžã§å€éšã¯ã©ã¹åã®ãã©ã€ããŒãã¡ã³ããŒã宣èšããŸãã å€éšã¯ã©ã¹ã®ã¡ãœãããåŒã³åºãããšãã§ããããã«ãã¯ã©ã¹ã®ãã©ã€ããŒãã¡ã³ããŒãä»ããŠå€éšã¯ã©ã¹ã®å¯Ÿå¿ããã¡ãœãããå
éšã§åŒã³åºãã¡ãœãããã¯ã©ã¹ã«å®çŸ©ããŸãïŒæ··ä¹±ããããã«èãããŸãããã³ãŒãããã¯ãã¹ãŠãæç¢ºã ãšæããŸãïŒã
import Foundation import SwiftFramework public class SwiftClassObjCWrapper: NSObject { private let swiftClass = SwiftClass() public func swiftMethod() { swiftClass.swiftMethod() } }
ïŒ
NSObject
ã¯ã©ã¹ãš
NSObject
ã¢ãããŒã·ã§ã³ãžã®ã¢ã¯ã»ã¹ã¯ã
Foundationã®ã€ã³ããŒãåŸã«è¡šç€ºãããŸããïŒ
æãããªçç±ã«ããã宣èšã§åãã¯ã©ã¹åãšã¡ãœããåã䜿çšããããšã¯ã§ããŸããã ãããŠãããã§
@objc
ã¢ãããŒã·ã§ã³ã圹ç«ã¡ãŸãã
@objc(SwiftClass) public class SwiftClassObjCWrapper: NSObject { private let swiftClass = SwiftClass() @objc public func swiftMethod() { swiftClass.swiftMethod() } }
ããã§ããObjective-Cãã³ãŒãããåŒã³åºãå Žåãã¯ã©ã¹ãšã¡ãœããã®ååã¯ãå€éšã¯ã©ã¹ãã察å¿ããååãèšè¿°ããŠãããã®ããã«ãèŠãããšããã«ãªããŸãã
SwiftClass *swiftClass = [SwiftClass new]; [swiftClass swiftMethod];
ãObjective-Cããã¡ã€ã«ã§ãSwiftãã¡ãœããã䜿çšããæ©èœ
æ®å¿µãªããããã¹ãŠã®ïŒãããªãã¯ïŒãSwiftãã¡ãœãããåã«
@objc
ã§
@objc
ããããObjective-Cãå
ã§äœ¿çšã§ããããã§ã¯ãããŸããã ãSwiftããšãObjective-Cãã¯ç°ãªãæ©èœãšç°ãªãããžãã¯ãæã€ç°ãªãèšèªã§ããããSwiftãã³ãŒããèšè¿°ãããšãããObjective-Cãã«ã¯ãªãããŸãã¯æ ¹æ¬çã«ç°ãªãå®è£
ã®æ©èœã䜿çšããããšããããããŸãã
ããšãã°ãããã©ã«ãèšå®ã¯ç Žæ£ããå¿
èŠããããŸãã ãã®æ¹æ³ïŒ
@objc public func anotherSwiftMethod(parameter: Int = 1) {
...ãObjective-Cãã³ãŒãå
ã§ã¯ã次ã®ããã«ãªããŸãã
[swiftClassObject anotherSwiftMethodWithParameter:1];
ïŒ
1
ã¯æž¡ããå€ã§ãåŒæ°ã«ã¯ããã©ã«ãå€ã¯ãããŸãããïŒ
ã¡ãœããå
Objective-Cã«ã¯ãObjective-Cç°å¢ã§Swiftã¡ãœããã«ååãä»ããç¬èªã®ã·ã¹ãã ããããŸãã ã»ãšãã©ã®åçŽãªã±ãŒã¹ã§ã¯ãååã«æºè¶³ã§ããŸãããå€ãã®å Žåãèªã¿ãããããã«ã¯ä»å
¥ãå¿
èŠã§ãã ããšãã°ã
do(thing:)
â Objective-Câã®ç²Ÿç¥ã«ããã¡ãœããã®ååã¯
doWithThing:
ã«
doWithThing:
ããã¯ããããæå³ãšäžèŽããŸããã ãã®å Žåãã
@objc
ã¢ãããŒã·ã§ã³ã
@objc
ãŸãïŒ
@objc(doThing:) public func do(thing: Type) {
ãSwiftãã¡ãœããã
throws
ãšããŒã¯ãããŠããå ŽåããObjective-Cãã¯ãã®ã·ã°ããã£ã«å¥ã®ãã©ã¡ãŒã¿ãŒã远å ããŸã-ã¡ãœãããã¹ããŒãããšã©ãŒã äŸïŒ
@objc(doThing:error:) public func do(thing: Type) throws {
ãã®æ¹æ³ã®äœ¿çšã¯ããObjective-CãïŒããã°ïŒã®ç²Ÿç¥ã§è¡ãããŸãã
NSError *error = nil; [swiftClassObject doThing:thingValue error:&error]; if (error != nil) {
ãã©ã¡ãŒã¿ãŒãšæ»ãå€ã§ã®Swiftåã®äœ¿çš
ãSwiftã
颿°ã®ãã©ã¡ãŒã¿å€ãŸãã¯æ»ãå€ãããObjective-Cãç°å¢ã«èªåçã«è»¢éãããªãæšæºã®ãSwiftãã¿ã€ãã䜿çšããªãå Žåããã®ã¡ãœããã¯ãObjective-Cãç°å¢ã§åã³æ©èœããŸãã...圌ããæãèµ·ããããããªã
ãã®ãSwiftãã¿ã€ãã
NSObject
ã®åŸç¶ã§ããå Žåãåè¿°ã®ããã«åé¡ã¯ãããŸããã ããããã»ãšãã©ã®å Žåãããã¯ããã§ã¯ãªãããšã倿ããŠããŸãã ãã®å Žåãã©ãããŒã¯åã³åœ¹ç«ã¡ãŸãã ããšãã°ãå
ã®ãSwiftãã³ãŒãïŒ
class SwiftClass { func swiftMethod() {
圌ã®ããã«ã©ããïŒ
@objc(SwiftClass) public class SwiftClassObjCWrapper: NSObject { private let swiftClassObject: SwiftClass init(swiftClassObject: SwiftClass) { self.swiftClassObject = swiftClassObject super.init() } @objc public func swiftMethod() { swiftClassObject.swiftMethod() } } @objc(AnotherSwiftClass) public class AnotherSwiftClassWrapper: NSObject { private let anotherSwiftClassObject = AnotherSwiftClass() @objc func anotherSwiftMethod() -> SwiftClassObjCWrapper { return SwiftClassObjCWrapper(swiftClassObject: anotherSwiftClassObject.anotherSwiftMethod()) } }
ãObjective-Cãå
ã§äœ¿çšïŒ
AnotherSwiftClass *anotherSwiftClassObject = [AnotherSwiftClass new]; SwiftClass *swiftClassObject = [anotherSwiftClassObject anotherSwiftMethod]; [swiftClassObject swiftMethod];
ãObjective-Cãã¯ã©ã¹ã«ãããSwiftããããã³ã«ã®å®è£
äŸãšããŠããã¡ããããã©ã¡ãŒã¿ãŸãã¯ã¡ãœããã®æ»ãå€ããObjective-CïŒã§ã¯äœ¿çšã§ããªãããSwiftãåã䜿çšãããããã³ã«ãåãäžããŸãããã
public class SwiftClass { } public protocol SwiftProtocol { func swiftProtocolMethod() -> SwiftClass } public func swiftMethod(swiftProtocolObject: SwiftProtocol) {
ããäžåºŠã©ããããå¿
èŠããããŸãã ã¯ããã«
SwiftClass
ïŒ
@objc(SwiftClass) public class SwiftClassObjCWrapper: NSObject { let swiftClassObject = SwiftClass() }
次ã«ã
SwiftProtocol
ã«äŒŒãç¬èªã®ãããã³ã«ãäœæããŸãããã¯ã©ã¹ã®ã©ããããŒãžã§ã³ã䜿çšããŸãã
@objc(SwiftProtocol) public protocol SwiftProtocolObjCWrapper { func swiftProtocolMethod() -> SwiftClassObjCWrapper }
次ã«ãæãè峿·±ãã®ã¯ãå¿
èŠãªãSwiftããããã³ã«ãé©å¿ããããSwiftãã¯ã©ã¹ã宣èšããããšã§ãã ããã¯ããObjective-Cããããžã§ã¯ãã§é©å¿ããããã«äœæãããããã³ã«ãšãå
ã®ãSwiftããããã³ã«ã®ãªããžã§ã¯ããåãå
¥ãããSwiftãã¡ãœãããšã®éã®äžçš®ã®ããªããžã«ãªããŸãã ã¯ã©ã¹ã®ã¡ã³ããŒã«ã¯ã説æãããããã³ã«ã®ã€ã³ã¹ã¿ã³ã¹ãå«ãŸããŸãã ãŸãããããã³ã«ã¡ãœããã®ã¯ã©ã¹ã¡ãœããã¯ãäœæãããããã³ã«ã®ã¡ãœãããåŒã³åºããŸãã
class SwiftProtocolWrapper: SwiftProtocol { private let swiftProtocolObject: SwiftProtocolObjCWrapper init(swiftProtocolObject: SwiftProtocolObjCWrapper) { self.swiftProtocolObject = swiftProtocolObject } func swiftProtocolMethod() -> SwiftClass { return swiftProtocolObject.swiftProtocolMethod().swiftClassObject } }
æ®å¿µãªããããããã³ã«ã€ã³ã¹ã¿ã³ã¹ãåãå
¥ããã¡ãœãããã©ããããã«ã¯ã§ããŸããã
@objc public func swiftMethodWith(swiftProtocolObject: SwiftProtocolObjCWrapper) { methodOwnerObject.swiftMethodWith(swiftProtocolObject: SwiftProtocolWrapper(swiftProtocolObject: swiftProtocolObject)) }
æãç°¡åãªãã§ãŒã³ã§ã¯ãããŸãããïŒ ã¯ã ãã ãã䜿çšããã¯ã©ã¹ãšãããã³ã«ã«å
·äœçãªæ°ã®ã¡ãœãããããå Žåãã©ãããŒã¯ãœãŒã¹ã³ãŒãã«å¯ŸããŠããã»ã©äžåè¡¡ã«å€§ãããªãããšã¯ãããŸããã
å®éããObjective-Cãã³ãŒãèªäœã§ãããã³ã«ã䜿çšããããšã¯ããã§ã«éåžžã«èª¿åããŠããããã«èŠããŸãã ãããã³ã«ã¡ãœããã®å®è£
ïŒ
@interface ObjectiveCClass: NSObject<SwiftProtocol> @end @implementation ObjectiveCClass - (SwiftClass *)swiftProtocolMethod { return [SwiftClass new]; } @end
ã¡ãœããã䜿çšããŠïŒ
(ObjectiveCClass *)objectiveCClassObject = [ObjectiveCClass new]; [methodOwnerObject swiftMethodWithSwiftProtocolObject:objectiveCClassObject];
ãSwiftãããã³ãObjective-Cãã®åæå
ãObjective-Cããããžã§ã¯ãã§åæããããSwiftãåã䜿çšããå ŽåãèŠåã1ã€ã ããããŸããæŽæ°
åã®Raw Typeãå¿
èŠã§ãã ãã®å Žåã®ã¿ã
enum
ã«
@objc
ãšããŠæ³šéãä»ããããšãã§ããŸãã
enum
åã倿Žã§ããªããããObjective-Cãå
ã§äœ¿çšãããå Žåã¯ã©ããªããŸããïŒ éåžžã©ããããã®åæåã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããŠã¡ãœãããã©ããããç¬èªã®
enum
åãã¹ãªãã
enum
ãŸãã äŸïŒ
enum SwiftEnum { case firstCase case secondCase } class SwiftClass { func swiftMethod() -> SwiftEnum {
ãããã«
ããããããã®ãããã¯ã«ã€ããŠå ±åãããã£ãã®ã¯ããã ãã§ãã ã»ãšãã©ã®å ŽåããSwiftãã³ãŒãããObjective-Cãã«çµ±åããæ¹æ³ã¯ä»ã«ããããŸãããäžèšã®ããžãã¯ã䜿çšããŠãããã«å¯ŸåŠããããšã¯éåžžã«å¯èœã§ãã
ãã¡ããããã®ã¢ãããŒãã«ã¯æ¬ ç¹ããããŸãã æãæçœãªïŒæåœ¢ã®è¿œå ã³ãŒãã®èšè¿°ïŒã«å ããŠããã1ã€éèŠãªãã®ããããŸãããSwiftãã³ãŒãã¯ãObjective-Cãã©ã³ã¿ã€ã ã«è»¢éãããã»ãšãã©ã®å Žåãå°ãªããšãé«éã§ã¯åäœããŸããã èçŒã«ããå€ãã®å Žåã®éãã¯é¡èã§ã¯ãããŸãããã