2016-02-23 11 views
6

मैं एक मौजूदा बड़े कोडबेस पर काम कर रहा हूं जो मुख्य रूप से उद्देश्य-सी है लेकिन स्विफ्ट में परिवर्तित करने की प्रक्रिया में है।स्विफ्ट/ओबीजेसी सर्कुलर आयात

स्विफ्ट में नए वर्ग लागू किए जा रहे हैं, लेकिन इनमें से कुछ कक्षाओं को मौजूदा ओबीजेसी कोड से एक्सेस करने की आवश्यकता है। ओबीजेसी और स्विफ्ट दोनों सर्वोत्तम प्रथाओं का पालन करने के प्रयास में, नए वर्गों में उपसर्ग नहीं है, लेकिन ओबीजेसी के लिए उपसर्ग के साथ परिभाषित किया गया है।

/** 
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 का उपयोग करने का प्रयास करता हूं, तो प्रारंभकर्ता उपलब्ध नहीं है।

enter image description here

अगर मैं बजाय इस रूप में ClassA को फिर से परिभाषित, सब कुछ ठीक फिर से है।

class XXClassA: NSObject { 
    let foo = "bar" 
} 

मुझे समझ में क्यों यह हो रहा है और ठीक मैं जगह में है, हालांकि मैं उपसर्ग ObjC वर्गों की इस पद्धति का उपयोग जारी रखना चाहते हैं। परिपत्र आयात से बचने के तरीके पर कोई विचार, लेकिन नामकरण सम्मेलन भी रखते हैं?

पूर्ण कोड यहाँ नमूना: https://gist.github.com/justAnotherDev/78483f9d94e40fd90c38

उत्तर

0

मैं एक ही समस्या आ रही है। मेरा कामकाज है:

  • स्विफ्ट क्लास के लिए एक ओबीजेसी-शैली प्रीफ़िक्स्ड नाम का उपयोग करें।
  • एक टाइपिया जोड़ें: typealias ClassA = XXClassA
  • हमेशा स्विफ्ट कोड से अपूर्ण नाम का उपयोग करें।

इस पैटर्न के साथ पिछली ओबीजेसी निर्भरता समाप्त होने पर उपसर्ग को हटाने के लिए कम से कम आसान है।

संबंधित मुद्दे