2014-06-20 13 views
56

से ऑब्जेक्टिव-सी # डिफाइन का उपयोग कैसे करें मैं स्विफ्ट के साथ थोड़ा सा ट्रेन करने के लिए UIViewController कक्षा माइग्रेट कर रहा हूं। मैं ब्रिजिंग हेडर के माध्यम से उद्देश्य-सी कोड का सफलतापूर्वक उपयोग कर रहा हूं लेकिन मुझे एक स्थिरांक फ़ाइल आयात करने की आवश्यकता है जिसमें #define निर्देश शामिल हैं।स्विफ्ट

मैं Using Swift with Cocoa and Objective-C (सरल मैक्रो) में देखा है निम्नलिखित:

सरल मैक्रो

कहाँ आप आमतौर पर सी और ऑब्जेक्टिव-सी में एक आदिम लगातार परिभाषित करने के लिए #define निर्देश इस्तेमाल किया, में स्विफ्ट आप इसके बजाय एक वैश्विक स्थिरता का उपयोग करें। उदाहरण के लिए, निरंतर परिभाषा #define FADE_ANIMATION_DURATION 0.35 स्विफ्ट में let FADE_ANIMATION_DURATION = 0.35 के साथ बेहतर व्यक्त की जा सकती है। चूंकि सरल स्थिर-जैसे मैक्रोज़ मानचित्र सीधे वैश्विक चर को स्विफ्ट करने के लिए, संकलक स्वचालित रूप से सी और उद्देश्य-सी स्रोत फ़ाइलों में परिभाषित सरल मैक्रोज़ आयात करता है।

तो, ऐसा लगता है कि यह संभव है। मैंने अपनी स्थिरांक वाली फाइल को ब्रिजिंग हेडर में आयात किया है, लेकिन मेरे पास फ़ाइल से कोई दृश्यता नहीं है, इसे हल नहीं किया जा सकता है।

मेरे स्थिरांक को स्विफ्ट के लिए दृश्यमान बनाने के लिए मुझे क्या करना चाहिए?

अद्यतन:

यह नहीं NSString स्थिरांक के साथ काम करने लगता है, लेकिन बूलियन्स साथ: इस समय

#define kSTRING_CONSTANT @"a_string_constant" // resolved from swift 
#define kBOOL_CONSTANT YES // unresolved from swift 
+1

हाँ के बजाय सच का उपयोग करें। –

उत्तर

42

, कुछ #define रों बदल रहे हैं और कुछ नहीं कर रहे हैं। अधिक विशेष रूप से:

#define A 1 

... हो जाता है:

var A: CInt { get } 

या:

#define B @"b" 

... हो जाता है:

var B: String { get } 

दुर्भाग्य से, YES और NO नहीं कर रहे ' टी मान्यता प्राप्त है स्विफ्ट कंपाइलर द्वारा फ्लाई पर परिवर्तित किया गया।

मेरा सुझाव है कि आप अपने #define एस को वास्तविक स्थिरांक में परिवर्तित करें, जो #define से भी बेहतर है।

ज:

extern NSString* const kSTRING_CONSTANT; 
extern const BOOL kBOOL_CONSTANT; 

।मीटर

NSString* const kSTRING_CONSTANT = @"a_string_constant"; 
const BOOL kBOOL_CONSTANT = YES; 

और फिर स्विफ्ट देखेंगे:

var kSTRING_CONSTANT: NSString! 
var kBOOL_CONSTANT: ObjCBool 

एक अन्य विकल्प अपने BOOL

#define kBOOL_CONSTANT 1 

तेज़ करने के लिए परिभाषित करता है बदलने के लिए किया जाएगा। लेकिन वास्तविक स्थिरांक के रूप में उतना अच्छा नहीं है।

+0

क्या मैं एनएसएसटींग का उपयोग करने का कारण जान सकता हूं! और स्ट्रिंग नहीं! ? – Ricky

+1

मुझे लगता है कि ऐसा इसलिए है क्योंकि इसका उपयोग करने से पहले निरंतर शून्य होने पर आपको कभी परीक्षण नहीं करना पड़ता है, इसलिए उपयोग किए जाने पर इसे "सुरक्षित" करने के लिए "सुरक्षित" है। हालांकि मैं एनएसएसटींग को छोड़ देता था लेकिन मैं इस समय स्विफ्ट के साथ confortable नहीं हूँ :) – foOg

+1

जब मैक्रोज़ कोड उत्पन्न करने के लिए उपयोग किया जाता है ...? – Ixx

19

उपरोक्त कुछ चीज़ों पर बस एक त्वरित स्पष्टीकरण।

स्विफ्ट लगातार कीवर्ड let

उदाहरण के लिए का उपयोग कर व्यक्त कर रहे हैं:

let kStringConstant:String = "a_string_constant" 

इसके अलावा, केवल एक प्रोटोकॉल परिभाषा आप उपयोग कर सकते हैं {मिल}, उदाहरण:

protocol MyExampleProtocol { 
     var B:String { get } 
    } 
7

में तेजी से आप किसी भी वर्ग या समारोह के बाहर एक enum, variable या function घोषित कर सकते हैं और यह आपके सभी वर्गों (वैश्विक स्तर पर) में उपलब्ध होगा (आयात करने की आवश्यकता के बिना विशिष्ट फ़ाइल)।

import Foundation 
    import MapKit 

let kStringConstant:String = "monitoredRegions" 

    class UserLocationData : NSObject {  
class func getAllMonitoredRegions()->[String]{ 
    defaults.dictionaryForKey(kStringConstant) 
} 
+1

क्या आप लगता है कि 'kStringConstant' के प्रकार को रद्द करना आवश्यक है जिसे प्रदान की गई सामग्री द्वारा अनुमानित किया जा सकता है," monitoredRegins "'। –

+0

वास्तव में नहीं। यह सिर्फ एक कोडिंग अभ्यास है, किसी भी हार्डकोडेड स्ट्रिंग को मैं इसे शीर्ष पर रखना चाहता हूं। बाद में इसे आसानी से एक स्थिरांक फ़ाइल में ले जाएं। –

-1

सरल तेज भाषा एक मैक्रो सभी #define निर्देशों की जरूरत नहीं है। और जटिल मैक्रोज़ को func

0

मैक्रो के लिए विकल्प वैश्विक चर हो सकता है। हम कक्षा के बाहर वैश्विक चर घोषित कर सकते हैं और वर्ग का उपयोग किए बिना उन तक पहुंच सकते हैं। नीचे

आयात फाउंडेशन उदाहरण प्राप्त करें जाने BASE_URL = "www.google.com"

कक्षा की परीक्षा {

}