ããã«ã¡ã¯åäººïŒ ç§ã¯ãã©ãã¯ããã¯ã¹ããçªãåºãŠãã匊ãåŒã£åŒµãã ãã§éå±ããŠãã人ã®1人ã§ããããŒãã®äžã§ã©ã®ããã«æ©èœããããèªåã®ç®ã§èŠããã§ãã ã©ã³ã¿ã€ã ã«ã€ããŠèª¬æããŸããã¯ãã©ã³ã¿ã€ã ã§ãã ç§ãã¡ã®çµéšã§ã¯ãObjective-Cã®å€ãè¯ãç¥ç¶ãšããŸã éçºäžã®é©æ°çãªSwiftãæ€èšããŠãã ããã ããªããšç§ã¯ãAppleããã°ã©ããŒãæ
éã«èãæããæœè±¡åã®ã»ãŒåºèŸºãŸã§æœãå¿
èŠããããŸãã äžè¬ã«æ°ããèšèªãéçºããå¿
èŠããã£ãçç±ãå°ãèŠãŠã¿ãŸãããã ç¹ã«ããã§ã«çµéšã®ããObjective Céçºè
ãããå€ãã®åŠå®çãªã¬ãã¥ãŒãèããããšããããŸãããæ°ããSwiftèšèªãããèŠããšãããæçããŠããŠçå£ã§ãã æåã«ã圌ã¯Objective Cã®åºç€ãšãªãCãšã¯ç°ãªããC ++ã§èšè¿°ããŸãããããã§ã¯ãããªããåæã§ãããéåžžã«å人çãªåèŠã®ã¿ã衚çŸããŸãã
ç§ã®æèŠã§ã¯ãçŸæç¹ã§ã®C ++ã¯ãããªãã奜ããªããšãè¡ãããšãã§ããæãæ·±å»ãªéçºèšèªã§ãããCããããšã¬ã¬ã³ãã§ãã ã ãããããSwiftèšèªã
LLDBãªã©ãæžãããã®åºç€ãšããŠéžã°ããã®ã¯åœŒã ã£ããšæããŸãã ããã§ã¯Swiftèšèªã®æ©èœã確èªããã«ãããã€ãã®ãã€ã³ãã匷調ããŸããä»ã®ãã¹ãŠã¯å°éã®ããã¥ã¡ã³ãã«èšèŒãããŠããŸãã ç§ã®æèŠã§ã¯ãåå¿è
ããã°ã©ããŒã«ãšã£ãŠã¯ã¯ããã«æ©èœçã§ç°¡åã§ããå®éãããã¯éçºã®ç®æšã®1ã€ã§ãããæ°ããéçºè
ã®ãšã³ããªãŒãããå€ãäžããããšã§ãã ç¹ã«ç°¡æœãªCïŒãŸãã¯Javaã§æžããå Žåã¯ç¹ã«ãObjective-Cã®æ¬åŒ§ãåããŠç¥ã£ãåŸãã©ã®ããã«é«ªãç«ãŠãããèŠããŠãããŠãã ããã ãã¡ãããç§ã®æèŠã§ã¯ãç®ç«ã€ããã«ããã°ã©ããŒãæãã€ããã®ã¯æŽç·ŽãããŠããªãã£ãããã§ã¯ãããŸããã ããããããããã¹ãŠã®æè©ã§ããããžãã¹ã«åãæãããŸãããã æåã«ãObjectice Cã®ç¥ç¶ã®åºæ¬ã¯ã©ã¹ãåæããSwiftãšæ¯èŒããŸãããã
ããããã¹ãŠç¥ã£ãŠãã人ã®ããã«ãããªãã¯ãŸã ç
ã®ããã«åºãããããšãã§ããŸãã Objective-Cã§ç¥ã£ãŠããããã«ãã¯ã©ã¹ã¯NSObjectãŸãã¯NSProxyãã鿥çãŸãã¯çŽæ¥ç¶æ¿ããå¿
èŠããããŸãã NSObjectã¯ã©ã¹ã¯ãéå
¬åŒãããã³ã«NSObjectãå®è£
ããŠããŸãã SwiftObjectãæ€èšãããšãããã«æ»ããŸãã å°æ¥çã«ã¯ãå°æ¥çã«2ã€ã®èšèªã®åéãäœãã®ã«åœ¹ç«ã€ã®ã¯ãã®ãããã³ã«ã§ãããšèšããŸããããã«ãããããªã¢ãŒãã£ãºã ã®åã§ãïŒ NSObjectã¯ã©ã¹ã®ãã¹ãŠã®ã¡ãœããã®äžéšãèŠãŠãããŸãã ãããŠãã®åŸããã®ãã°ãããNSObjectã®äœãåé¡ãªã®ããæ¢ããŠçµè«ä»ããŸããã ç§ã¯é·ãéããªããèŠãããŸããã圌ãã¯é転ããŸããïŒ
@interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; } + (void)load; + (void)initialize; - (instancetype)init #if NS_ENFORCE_NSOBJECT_DESIGNATED_INITIALIZER NS_DESIGNATED_INITIALIZER #endif ; + (instancetype)new OBJC_SWIFT_UNAVAILABLE("use object initializers instead"); + (instancetype)allocWithZone:(struct _NSZone *)zone OBJC_SWIFT_UNAVAILABLE("use object initializers instead"); + (instancetype)alloc OBJC_SWIFT_UNAVAILABLE("use object initializers instead"); - (void)dealloc OBJC_SWIFT_UNAVAILABLE("use 'deinit' to define a de-initializer"); - (void)finalize; ....
æåã®2ã€ã®æ¹æ³ã¯ãéåžžã®Objectice Céçºè
ã«ã¯ããŸãåºäŒããªããããããã§ã¯è©³ãã説æããŸããã loadã¡ãœããã¯ãã¯ã©ã¹ãŸãã¯ã«ããŽãªãã©ã³ã¿ã€ã ã«ããŒãããããšãã«åŒã³åºãããç¶æ¿ã®å€å
žçãªèŠåã«åŸãããå®è¡æã«ã¢ããªã±ãŒã·ã§ã³ããããã¯ããŸãã åæåã¡ãœããã¯ãã¯ã©ã¹ãæåã«äœ¿çšããåã«é
å»¶ã¢ãŒãã§åŒã³åºãããã¢ããªã±ãŒã·ã§ã³ããããã¯ãããç¶æ¿ã®å€å
žçãªèŠåã«åŸããŸãã
åŸç¶ã®ãã¹ãŠã®ã¡ãœããã¯ããªããžã§ã¯ãã®äœæãšåæåãæ
åœããŸãã ãŸãããããã«ã€ããŠãå°ã説æããŸãã allocWithZoneã¡ãœãã㯠ããªããžã§ã¯ãã«ã¡ã¢ãªãå²ãåœãŠã圹å²ãæãããŸãã å
éšã§ã¯ã圌ã¯ç§ãã¡ã®ææã®mallocãåŒã³åºããŸãã ããã¯ãã¡ã¢ãªããŸãŒã³ã«åå²ããããšãã®beã®æä»£ããã§ãã ãã¹ãŠã®ãªããžã§ã¯ãã1ã€ã®ãŸãŒã³ã§äœæãããããã«ãªã£ããããå
éšã§allocWithZoneãåŒã³åºããŠããã©ã«ãã®ãŸãŒã³NSDefaultMallocZoneãæž¡ãallocã¡ãœãããç»å ŽããŸãã ã
ãªããžã§ã¯ããåé€ããããšã deallocã¡ãœãããšfinalizeã¡ãœãããåŒã³åºãããŸãã ãããã®ã¡ãœããã§ã¯ãé¢é£ãããã¹ãŠã®ãªãœãŒã¹ãã¯ãªã¢ããããã®çµæã空ãã¡ã¢ãªã空ãã¡ã¢ãªããŒã«ã«å
¥ããŸãã éåžžã ãã¡ã€ãã©ã€ãºã¯äœ¿çšããããæåŸã®ãªãªãŒã¹ãçºçããã¹ã¬ããã§deallocãåŒã³åºãããŸã ã
次ã®äžé£ã®ã¡ãœããã«ç§»åããŸã
- (id)copy; - (id)mutableCopy; + (id)copyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE; + (id)mutableCopyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;
ãŸããããããã¹ãããã©ã€ãã§æžããããšã®ãªã人ã«ãšã£ãŠãã圌ããã³ããŒã®ããã ãšæšæž¬ããã®ã¯ç°¡åã§ãã ãŸãŒã³ã§ã¯ããã¹ãŠãæç¢ºã§ããããããã¯ãã¯ãé¢ä¿ã®ãªãå€ä»£ã®æ¹æ³ã§ãã å®éãç§ãã¡ããäœããã³ããŒããã«ã¯ã NSCopyingãããã³ã«ãå®è£
ããå¿
èŠããããŸãããããã®ã¡ãœãããåçŽã«åŒã³åºããšããã¹ãŠã倱æããŸãã ãã ããããã«ã€ããŠã¯åŒãç¶ã説æããŸãã ãããŸã§ã®éãæ¬¡ã®ããã¯ã«é²ã¿ãŸãã
+ (BOOL)instancesRespondToSelector:(SEL)aSelector; + (BOOL)conformsToProtocol:(Protocol *)protocol; - (IMP)methodForSelector:(SEL)aSelector; + (IMP)instanceMethodForSelector:(SEL)aSelector; - (void)doesNotRecognizeSelector:(SEL)aSelector; + (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE(""); - (BOOL)allowsWeakReference UNAVAILABLE_ATTRIBUTE; - (BOOL)retainWeakReference UNAVAILABLE_ATTRIBUTE; + (BOOL)isSubclassOfClass:(Class)aClass; + (BOOL)resolveClassMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0); + (BOOL)resolveInstanceMethod:(SEL)sel OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0); + (Class)superclass; + (Class)class OBJC_SWIFT_UNAVAILABLE("use 'aClass.self' instead");
ããã§ã¯ãå
çã§ãã å®å
šãªã³ãŒãã®éµã¯æ€çŽ¢ãšã³ãžã³siã«ãããŸãã ãããã®ã¡ãœããã«ããããªããžã§ã¯ããŸãã¯ã¯ã©ã¹ãå®è£
ãããããã³ã«ãå¿çå¯èœãªã»ã¬ã¯ã¿ãŒãªã©ãè©äŸ¡ã§ããŸãã é²ã
- (id)forwardingTargetForSelector:(SEL)aSelector OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0); - (void)forwardInvocation:(NSInvocation *)anInvocation OBJC_SWIFT_UNAVAILABLE(""); - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector OBJC_SWIFT_UNAVAILABLE("");
æåã®2ã€ã®ã¡ãœããã¯ãäœãå®è£
ããªããšãã¹ãŠãã¯ã©ãã·ã¥ãããŸã§åŒã³åºãããŸãã ããã¯ããªããžã§ã¯ããããªããããããäœãæãã§ããããçè§£ããããããæããªãã¡ãœãããåŒã³åºããšãã«èµ·ãããŸãã ãããææçŸ©ã«è¡ãå Žåã¯ããããã®ã¡ãœããã®1ã€ã決å®ããã»ã¬ã¯ã¿ãŒãžã®åŒã³åºããéä¿¡å
ãããã°åŠçãæ±ºå®ããã®ã«åå芪åã«ããŠãã ããã ããã¯ãå®éã«ã¯ã¡ãã»ãŒãžãªãã€ã¬ã¯ãã¡ã«ããºã ãšåŒã°ããŸãã ãããèªãããšãã§ããããããã®èšäºãããã3ã€ã®æ¹æ³ããããŸãã ããã«ãã ããã€ããã¯ãããŸããããããªããšããã®èšäºã®æ¬è³ªã倱ããŸãã
ææ°ã®æ¹æ³ãèŠãŠã¿ãŸããã
+ (NSUInteger)hash; + (NSString *)description; + (NSString *)debugDescription;
ç§ã¯èª°ããããã·ã¥ã¡ãœãããç¥ã£ãŠãããšæããããã¯ãªããžã§ã¯ãã®æ¯èŒãã³ã¬ã¯ã·ã§ã³å
ã®ãã¹ãã«ãããªããžã§ã¯ãã®é
åžãªã©ã«äœ¿çšããã ãªããžã§ã¯ãã®ããã¢ãã¬ã¹ã ãã§ãªããäœããã®æå³ã®ããæ
å ±ããã°ã§è¡šç€ºããå Žåã¯ã descriptionã¡ãœãããšdebugDescriptionã¡ãœãããåå®çŸ©ããå¿
èŠããããŸãã
ãµããç§ã¯ãã§ã«ãããã®æ¹æ³ã説æããã®ã«ããããããŠããŸããã ãã®ã¯ã©ã¹ã詳ããèŠãŠã¿ãŸããããããã§ã¯ãåºæ¬çã«æ€çŽ¢ãšã³ãžã³ã®ãã¹ãŠã®ã¯ã©ã¹ã®å
é ã«ãããŸãã 圌ã®äœãåé¡ãªã®ã§ããïŒ ãªã圌ããããªã«å¥œããããªãã®ïŒ ã¯ãã圌ã®ãã¹ãŠãééã£ãŠããŸãïŒ
ç§ãã¡ã®OOPååãããã«èšãããã«ïŒç¶æ¿ãã«ãã»ã«åãããªã¢ãŒãã£ãºã ïŒ ããããäœããã®çç±ã§ã1ã€ã®ã¯ã©ã¹ãããã¹ãŠãç¶æ¿ãããšã¯èšãããŠããŸãããJavaãšCïŒã®éçºè
ãèš±ããŠãã ããã ã¢ãŒããã¯ãã£ãæ§ç¯ããçµéšã®ããããã°ã©ããŒã¯ãåœåã¯éåžžã«èãæãããŠããã¢ãŒããã¯ãã£ãŒæ±ºå®ã®ããŸããŸãªèœãšã穎ã«ééãããšæããŸãã ç¶æ¿ã¯æéç匟ã®ãããªãã®ã§ãæçµçã«ã¯ææ
®æ·±ãã¢ãŒããã¯ãã£ããã¹ãŠãŒãã«ããããéçºã®ããã«æãçžããŸãã 建ç¯ã«é¢ããå€ãã®æ¬ã¯ãç¶æ¿ã§ã¯ãªãæ§æãéžæãããšè¿°ã¹ãŠããŸãã ããã¯ããæè»ãªã¢ãããŒãã§ãããç¶æ¿ãåŠçããã®ã«éåžžã«åŒ·åã§ãã ã€ãŸããæœè±¡åãåé¢ããããã«æ¡åŒµããããšã¯æ£ããããšã§ãã ä»åŸãSwiftã¯ããã°ã©ããå©çšã§ãããã®åºæ¬ã¯ã©ã¹ã倱ã£ããšèšããŸãã
å®éãããã¯SwiftObjectãšåŒã°ããObjective-Cãšå¯Ÿè©±ããå¿
èŠããããã¹ãŠã®ã¯ã©ã¹ïŒSwiftã§èšè¿°ãããïŒãç¶æ¿ãããŸãã 圌ã«ã€ããŠãã£ãšè©±ããŸãããã å€ãã®äººãããããèšãã§ãããïŒãã®ç·ã¯äœã§ããïŒ ç¶æ¿ã¯ã¯ãŒã«ãªããšã§ãã³ãŒããåå©çšããŸãããããã¯æªãããšã§ãã ãã®ãããã¯ãå¥ã®èšäºã«å
¥ããŠãä»ã®ããšã«ã€ããŠè©±ããŸãã ããšãã°ãäœãã³ããŒããããªãã®ã«ããªãcopyã¡ãœãããå¿
èŠãªã®ã§ããïŒ ããã«ãããããããç§ã¯ãããåŒã³åºãããšãã§ããNSCopyingãã³ã¯ãå®è£
ããªãå Žåãããèªäœã§ãã¹ãŠãèœã¡ãŸãã ç¶æ¿ã«ã€ããŠè©±ããŸãããã ãªããžã§ã¯ããåæåããå Žåã«åŒã³åºãå¿
èŠãããinitã¡ãœããããããŸãããããèªäœã§åŒã³åºãããdeallocã¡ãœããããããŸãïŒ ãªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ã®ã¡ãœããã§ãããæ±ºããŠæåã§åŒã³åºãå¿
èŠã¯ãããŸããã ãããã誰ãç§ã«ããããããããŸãããæ¬åœã«çŽ æŽãããã§ããïŒ ã¯ããããã¯ãŸã£ããçŽ æŽãããããšã§ã¯ãããŸããã NSObjectã¯ã©ã¹èªäœã«ãããå¿
èŠã®ãªãããšãå®è¡ããããå¿
èŠã®ãªãããšãç¥ãããšãã§ããŸãã ãã®ãããã¯ãããã«çºå±ãããããšã¯ã§ããŸãããNSObjectããã¹ãã§ã¯ãªãããšã¯ãã§ã«æããã§ãããããããã°ã©ããŒã«ãšã£ãŠã¯Swiftèšèªã«å§¿ãæ¶ããŸããã æ£åŒã«ã¯ãã¡ãããåºæ¬ã¯ã©ã¹ã¯IOSãã©ãããã©ãŒã ã®ã¿ã«çãŸããŸãããããäºãã«ä»²è¯ãããããã«ãããã2ã€ã®èšèªïŒè人Objective-Cãšéå¿çãªSwiftã§ãã 圌ãçç®ã§èŠãŠã¿ãŸãããã
@implementation SwiftObject + (void)initialize {} + (instancetype)allocWithZone:(struct _NSZone *)zone { assert(zone == nullptr); return _allocHelper(self); } + (instancetype)alloc {
ããïŒ ã芧ã®å
容ã§ãããSwiftObjectã¯ã©ã¹ã¯éå
¬åŒãããã³ã«NSObjectãå®è£
ããŠããŸãããã¡ãœããã®å®è£
ã¯ãã§ã«å®å
šã«ç°ãªã£ãŠããŸãã NSObjectããæç€ºçã«ç¶æ¿ãããŠããªããã¹ãŠã®Swiftã¯ã©ã¹ã¯ãSwiftObjectã¯ã©ã¹ããæé»çã«ç¶æ¿ãããããã«ãªããŸããã ããã¯ãObjectice Cãšã®å¯Ÿè©±ãå¿
èŠãšãããã©ãããã©ãŒã ã§ã®ã¿çºçããããšãããã«ä¿®æ£ããŸããObjectiveC以å€ã®ãã©ãããã©ãŒã ïŒLinuxãªã©ïŒã§ã¯ãããã¯å¿
èŠãããŸããã
ç§ãã¡ãåŠãã ããã«ãããã¯å¥ã®è©±ã§ãã å°ãæããŠããããšæããŸãã ãåç¥ã®ããã«ãSwiftã¯Appleãªããžããªã®ãããªãã¯ãã¡ã€ã³ã«ãããŸãã 誰ããããããŠã³ããŒãããŠãœãŒã¹èªäœããã³ã³ãã€ã«ããããšãæ°ã«ããŸãããããã¯ãŸãã«ç§ãã¡ããã£ãããšã§ãã ããããç§ãã¡ã¯ããå°ãé²ã¿ãŸããã ããŒãžã§ã³8以éã®æåãªXcodeã䜿çšãããšãããŒã«ãã§ãŒã³ãæã«å
¥ããããšãã§ããŸãã ã¯ããããã¯ã©ãããæå³ã§ããïŒ ããã¯ããããã°æ
å ±ã䜿çšããŠSwiftãã¢ã»ã³ãã«ããXcodeã«é
眮ã§ããããšãæå³ããŸãã

ç§ã®ååã¯ããããã£ãã®ã§ãSwiftãœãŒã¹ãXcodeããçŽæ¥ãããã°ã§ããŸããã

ç§ãã¡ã¯å°ãæ°ãæ£ããããŠããŸããç§ãã¡ã¯æšè«ãç¶ããŸãã Objective-Cã§çæãããã¡ã¿ããŒã¿ãšSwiftã§çæãããã¡ã¿ããŒã¿ã®æ§è³ªãç°ãªãããšã¯ãã§ã«æããã§ãã Objectice Cã§é·ãéæžããŠãããå°ãªããšãå°ãã©ã³ã¿ã€ã ãéžæããããã°ã©ããŒãªã誰ã§ããã®æ§é ãç¥ã£ãŠãã
struct objc_class { Class isa OBJC_ISA_AVAILABILITY; #if !__OBJC2__ Class super_class OBJC2_UNAVAILABLE; const char *name OBJC2_UNAVAILABLE; long version OBJC2_UNAVAILABLE; long info OBJC2_UNAVAILABLE; long instance_size OBJC2_UNAVAILABLE; struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; struct objc_method_list **methodLists OBJC2_UNAVAILABLE; struct objc_cache *cache OBJC2_UNAVAILABLE; struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; #endif } OBJC2_UNAVAILABLE;
ç§ãã¡ã¯çããã¹ãŠã®ãªããžã§ã¯ããæçµçã«ãããçšåºŠãã®æ§é ã®åœ¢ã§èŠããããšãç¥ã£ãŠããŸãã ç§ãã¡ã®ãæ°ã«å
¥ãã®NSObjectã¯ããã®æ§é ãšçŽæ¥å¯Ÿè©±ããããšããããã°ã©ããä¿è·ããæœè±¡åã§ãã ããªãã¯ããã«ã€ããŠãã£ãšèªãããšãã§ããŸãããã·ã¢èªã§ãããèšèªã®ååšã®éã«æžãããããããã®èšäºããããŸãã Swiftã«æ»ããŸãããã çŸåšãã¡ã¿ããŒã¿ãä¿åããããã®ç¹å¥ãªã¯ã©ã¹ã®ã¡ã¿ããŒã¿ãç»å ŽããŸãããããã¯éåžžã«èšå€§ã§ãSwiftã®ãã¹ãŠã®ã¡ã¿ããŒã¿ã®åºç€ãæ§æããŸãã å¥ã®èšäºã§ãã®æ§é ã®è©³çްã説æããŸãã ãã1ã€ã®ãã€ã³ãã¯ããã¹ãŠã®Swiftãªããžã§ã¯ããç¬èªã®ã¡ã¿ããŒã¿æ§é ãæã£ãŠããã«ãããããããäºææ§ã®ããã«ããã«å€ãã®Objective-Cã¡ã¿ããŒã¿ãçæããŸãã ã€ãŸããåSwiftãªããžã§ã¯ãã«ã¯2ã»ããã®ã¡ã¿ããŒã¿ããããŸãã
å°ãèŠçŽããŸãããã NSObjectã¯èŠèŠãããããæ°ããèšèªã§äœ¿çšããå ŽæããªãããšãããããŸããã ãããã£ãŠãSwiftã§ã¯ãäœãããç¶æ¿ããã«ã¯ã©ã¹ãäœæã§ããŸãããå®éã«ã¯ãäºææ§ã®ããã«ãSwiftObjectããç¶æ¿ããŸãã SwiftObjectã¯ã©ã¹ã¯ãã¬ã³ãã«ãªããNSObjectã¯ã©ã¹ã¯éå
¬åŒãããã³ã«NSObjectã«ãã£ãŠèš±å¯ãããŸããã ããã«ãããSwiftãªããžã§ã¯ããidã«ãã£ã¹ãããObjective Cã«æž¡ãããšãã§ããŸãããããã§åäœããã®ãããã®ã§ãåSwiftãªããžã§ã¯ãã¯ããã®ã¡ã¿ããŒã¿ã«å ããŠãObjective C.ã¡ã¿ããŒã¿ãçæããŸãã ã¿ããªããããšãïŒ å¥åº·ãšè¯ãæ°åïŒ