मैं एक मौजूदा बड़े कोडबेस पर काम कर रहा हूं जो मुख्य रूप से उद्देश्य-सी है लेकिन स्विफ्ट में परिवर्तित करने की प्रक्रिया में है।स्विफ्ट/ओबीजेसी सर्कुलर आयात
स्विफ्ट में नए वर्ग लागू किए जा रहे हैं, लेकिन इनमें से कुछ कक्षाओं को मौजूदा ओबीजेसी कोड से एक्सेस करने की आवश्यकता है। ओबीजेसी और स्विफ्ट दोनों सर्वोत्तम प्रथाओं का पालन करने के प्रयास में, नए वर्गों में उपसर्ग नहीं है, लेकिन ओबीजेसी के लिए उपसर्ग के साथ परिभाषित किया गया है।
/**
Create contrived class that is named XXClassA in ObjC and ClassA in Swift.
*/
@objc(XXClassA) class ClassA: NSObject {
let foo = "bar"
}
अब तक यह बहुत अच्छा काम कर रहा है; स्विफ्ट कोड ClassA()
का उपयोग करता है और ओबीजेसी [[XXClassA alloc] init]
का उपयोग करता है। एक बार सभी ओबीजेसी कोड जो संदर्भ XXClassA को हटा दिया गया है, @objc(XXClassA)
को स्विफ्ट क्लास से भी हटाया जा सकता है।
दुर्भाग्य से यदि आपके पास ओबीजेसी कक्षा संदर्भ XXClassA है तो यह टूट जाता है और फिर स्विफ्ट कोड क्लास के अंदर उस नई कक्षा का उपयोग करने का प्रयास करता है।
मैं एक ObjC वर्ग, XXClassC
नामित बनाने कहो और उसका उपयोग करना ही को दर्शाता है एक XXClassA
//
// XXClassC.h
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class XXClassA;
@interface XXClassC : NSObject
-(instancetype)initWithA:(XXClassA *)classA;
@end
NS_ASSUME_NONNULL_END
वृत्तीय संदर्भ जगह में है (जो वास्तव में स्विफ्ट वर्ग ClassA
है)। यदि मैं क्लासए के अंदर से XXClassC का उपयोग करने का प्रयास करता हूं, तो प्रारंभकर्ता उपलब्ध नहीं है।
अगर मैं बजाय इस रूप में ClassA को फिर से परिभाषित, सब कुछ ठीक फिर से है।
class XXClassA: NSObject {
let foo = "bar"
}
मुझे समझ में क्यों यह हो रहा है और ठीक मैं जगह में है, हालांकि मैं उपसर्ग ObjC वर्गों की इस पद्धति का उपयोग जारी रखना चाहते हैं। परिपत्र आयात से बचने के तरीके पर कोई विचार, लेकिन नामकरण सम्मेलन भी रखते हैं?
पूर्ण कोड यहाँ नमूना: https://gist.github.com/justAnotherDev/78483f9d94e40fd90c38