2014-06-10 9 views
24

में #define मैक्रोज़ के साथ उद्देश्य-सी कोड का उपयोग कैसे करें I मेरा एक स्विफ्ट प्रोजेक्ट में एक तृतीय-पक्ष उद्देश्य-सी लाइब्रेरी का उपयोग करने का प्रयास कर रहा हूं। मेरे पास पुस्तकालय सफलतापूर्वक एक्सकोड में आयात किया गया है, और मैंने <Project>-Bridging-Header.h फ़ाइल बनाई है जो मुझे स्विफ्ट में मेरे उद्देश्य-सी कक्षाओं का उपयोग करने की अनुमति दे रही है।स्विफ्ट

मुझे लगता है कि एक समस्या में चल रहा है हालांकि: उद्देश्य-सी कोड में Constants.h फ़ाइल मैक्रो #define AD_SIZE CGSizeMake(320, 50) के साथ फ़ाइल शामिल है। मेरे <Project>-Bridging-Header.h में Constants.h आयात करने से वैश्विक स्थिर AD_SIZE का परिणाम नहीं मिलता है जो मेरा स्विफ्ट ऐप उपयोग कर सकता है।

मैं कुछ शोध किया और देखा कि एप्पल प्रलेखन here under "Complex Macros" का कहना है कि

"स्विफ्ट में, आप एक ही परिणाम प्राप्त करने के कार्य करता है और जेनरिक का उपयोग कर सकते हैं किसी भी समझौते के बिना [जटिल मैक्रो के रूप में]। इसलिए, जटिल मैक्रोज़ सी और ऑब्जेक्टिव-सी स्रोत फ़ाइलों में हैं उपलब्ध कराया जाता है नहीं अपने स्विफ्ट कोड के लिए। "

पढ़ने उसके बाद, मैं इसे स्विफ्ट में let AD_SIZE = CGSizeMake(320, 50) निर्दिष्ट करके ठीक काम मिल गया है, लेकिन मैं पुस्तकालय के साथ भावी संगतता को इस स्थिति में बनाए रखना चाहता हूं कि ये मूल्य मुझे बिना जानने के बदल जाए।

स्विफ्ट या मेरे ब्रिजिंग हेडर में इसके लिए कोई आसान फिक्स है? यदि नहीं, #define AD_SIZE CGSizeMake(320, 50)Constants.h में #define AD_SIZE CGSizeMake(320, 50) को प्रतिस्थापित करने का कोई तरीका है और पुराने AD_SIZE मैक्रो का उपयोग करने वाले किसी मौजूदा उद्देश्य-सी ऐप्स के साथ चीजों को पीछे-संगत रखें?

+1

क्या आपने मैक्रो के बजाय 'स्थिर CGSize' का उपयोग करने का प्रयास किया है? – jtbandes

+0

मेरा उत्तर –

उत्तर

5

मैं

extern CGSize const AD_SIZE;

साथ लाइब्रेरी की Constants.h में

#define AD_SIZE CGSizeMake(320, 50)

की जगह और जोड़ने

CGSize const AD_SIZE = { .width = 320.0f, .height = 50.0f };

द्वारा इस का समाधान पुस्तकालय की Constants.m फ़ाइल में

10

मैंने जो किया वह क्लास विधि बनाने के लिए है जो # परिभाषित करता है।

उदाहरण:

ज फ़ाइल:

#define AD_SIZE CGSizeMake(320, 50) 
+ (CGSize)adSize; 

मीटर फ़ाइल:

+ (CGSize)adSize { return AD_SIZE; } 

और स्विफ्ट में:

चूंकि यह एक क्लास विधि है, अब आप इसे लगभग # डिफाईन के रूप में उपयोग कर सकते हैं। आप अपने #define मैक्रो को बदलते हैं - यह नई विधि आप स्विफ्ट में बनाई में परिलक्षित होगा:

दें आकार = YourClass.adSize()

4

कक्षा घोषणा के बाद अपने स्थिरांक लिखें। इस तरह ...

class ForgotPasswrdViewController: UIViewController { 
let IS_IPHONE5 = fabs(UIScreen.mainScreen().bounds.size.height-568) < 1; 
let Tag_iamTxtf = 101 
+0

ओह मेरे भगवान की जांच करें। क्या आपको लगता है कि एक फोन है जो 567.5 पिक्सेल ऊंचा है? बस bounds.size.height == 568 लिखें। और महसूस करें कि आपका मैक्रो बुरी तरह से नामित है, क्योंकि ज़ूम मोड में आईपॉड टच या आईफोन 6/7 की ऊंचाई समान है। – gnasher729

+0

धन्यवाद @ gnasher729, आप मेरा जवाब संपादित कर सकते हैं। –