2017-11-28 24 views
5

में मैं एक मौजूदा ऑब्जेक्टिव-सी परियोजना के लिए तेजी से कोड जोड़ने हूँ। मुझे मौजूदा उपसर्ग शीर्षलेख से परिभाषा का संदर्भ देने में समस्याएं आ रही हैं।संदर्भ वर्ग परिभाषा तेज

@interface MyClass 
+(instancetype)myClass; 
-(void)doStuff; 
@end 

और मीटर:

@implementation MyClass 
+ (instancetype) myClass 
{ 
    // More to it than this, but this illustrates the setup 
    return [[MyClass alloc] init]; 
} 

- (void)doStuff 
{ 
    // Do something interesting 
} 
@end 

उपसर्ग हैडर MyProj-Prefix.pch शामिल हैं:

मैं एक वर्ग MyClass कहा जाता है, ज के साथ ऑब्जेक्टिव-सी में परिभाषित किया गया है

#define MYCLASS MyClass 
#define SOMEVAR @"Hello" 

मैंने एक ब्रिजिंग हेडर बनाया है जिसमें निम्न शामिल हैं:

#import "MyProj-Prefix.pch" 

परियोजना ऑब्जेक्टिव-सी कोड वर्ग परिभाषा का उपयोग करता है, उदाहरण के लिए होता है

[[MYCLASS myClass] doStuff]; 

मैं इसे अपने नए स्विफ्ट कोड में दर्पण करना चाहता हूं। मैं परिभाषित चर को देख और संदर्भित कर सकता हूं, लेकिन परिभाषित वर्ग दिखाई नहीं दे रहा है। जैसे

let someStr = SOMEVAR // This compiles 
MYCLASS.myClass.doStuff() // MYCLASS isn't visible 

यह कैसे प्राप्त करने के बारे में कोई संकेतक? मुझे यह भी यकीन नहीं है कि यह तेजी से संभव है या नहीं।

उत्तर

1

यह समस्या उपसर्ग शीर्षक में मौजूद होगा, भले ही #define MYCLASS MyClass किसी अन्य शीर्ष लेख में किया गया था, जरूरी नहीं। ऐसा इसलिए है क्योंकि प्रीप्रोसेसर निर्देश आमतौर पर स्विफ्ट में आयात नहीं किए जाते हैं। सरल मैक्रोज़, हालांकि, आयात किए जाते हैं यदि उन्हें वैश्विक स्थिरांक में मैप किया जा सकता है, जो SOMEVAR के लिए संभव है, लेकिन MYCLASS नहीं है। https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-ID17 देखें।

एक वैश्विक क्षेत्र में स्विफ्ट में एक typealias इस्तेमाल कर सकते हैं:

typealias MYCLASS = MyClass 
बेशक

, typealias संशोधित किया जा सकता है अगर MYCLASS था शीर्षक में फिर से परिभाषित करना होगा।

यह दृष्टिकोण नहीं बहुत मददगार,, अगर MYCLASS परिवर्तन की परिभाषा जहां/कैसे कोड बनाया गया है पर निर्भर करता है है दुर्भाग्य से। हालांकि, चूंकि कोड को विभिन्न कक्षाओं के लिए सामान्य व्यवहार के बारे में कुछ पता होना चाहिए जिसे MYCLASS के रूप में परिभाषित किया जा सकता है, उदाहरण के लिए यहां प्रोटोकॉल का उपयोग करना संभव हो सकता है।

अद्यतन: /के बारे में सोच इसके साथ कुछ और खेल रहे हैं और कुछ अन्य पोस्ट पढ़ने के बाद, जैसे Using obj-c typedef in Swift, मुझे लगता है कि एक बेहतर समाधान है। इस दृष्टिकोण के साथ यदि आप MYCLASS ऑब्जेक्टिव-सी में #define डी है तो आपको अपने स्विफ्ट कोड को बदलने की आवश्यकता नहीं है।

अपने ऑब्जेक्टिव-सी कोड, जैसे में कहीं ब्रिजिंग शीर्षक में, जोड़ने

typedef MYCLASS * _MYCLASS; 

जो तब आप स्विफ्ट में निम्नलिखित की तरह काम करने के लिए अनुमति देगा:

_MYCLASS.myClass().doStuff() 

तुम सच में किसी कारण से स्विफ्ट में MYCLASS का उपयोग करने पर जोर देते हैं, तो में typealias MYCLASS = _MYCLASS जोड़ने आपका स्विफ्ट कोड चाल करेगा।

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