उद्देश्य-सी में स्विफ्ट संरचना का उपयोग कैसे करें


97

बस मेरे पास एक संरचना है जो नीचे दिए गए एप्लिकेशन स्थिरांक को संग्रहीत करता है:

struct Constant {

    static let ParseApplicationId = "xxx"
    static let ParseClientKey = "xxx"

    static var AppGreenColor: UIColor {
        return UIColor(hexString: "67B632")
    }
}

इन स्थिरांक का उपयोग स्विफ्ट कोड में Constant.ParseClientKeyउदाहरण के लिए कॉल करके किया जा सकता है । लेकिन मेरे कोड में, इसमें कुछ ऑब्जेक्टिव-सी क्लासेस भी हैं। तो मेरा सवाल यह है कि Object-C कोड में इन स्थिरांक का उपयोग कैसे किया जाए?

यदि स्थिरांक घोषित करने का यह तरीका अच्छा नहीं है, तो स्विफ्ट और ऑब्जेक्टिव-सी कोड दोनों में उपयोग किए जाने वाले वैश्विक स्थिरांक बनाने का सबसे अच्छा तरीका क्या है?


22
कृपया सामान्य स्विफ्ट कोड शैली का अनुसरण करें और अपने लेट / वर आइडेंटिफ़ायर को शुरू करने के लिए एक लोअरकेस लेटर का उपयोग करें।
निकोलाई रुहे

4
@NikolaiRuhe क्या किसी संरचना के स्थिर गुणों के लिए यह सही शैली नहीं होगी? बहुत पसंद है UIControlEvents.TouchUpInside?
ल्यूक रोजर्स

1
@NikolaiRuhe स्विफ्ट घोषणा पर एक नज़र डालें: developer.apple.com/library/ios/documentation/UIKit/Reference/… - यह निश्चित रूप से एक संरचना है।
ल्यूक रोजर्स

1
@LukeRogers है कि स्विफ्ट 2.0 की वजह से NS_OPTIONSशैली enums आयात करने का तरीका बदल गया है । शब्दार्थ UIControlEventअभी भी एक गणन प्रकार है।
निकोलाई रुहे

5
@NikolaiRuhe ल्यूक रॉगर्स: दीन ने उस मुद्दे के बारे में नहीं पूछा, और हम में से अधिकांश दर्शकों ने इसके बारे में पढ़ने के लिए यहां क्लिक नहीं किया।
original_username

जवाबों:


114

कहने के लिए दुख की बात है, आप structएक्सपोज-सी के लिए न तो एक्सपोज़ कर सकते हैं और न ही ग्लोबल वैरिएबल। प्रलेखन देखें ।

अब तक, IMHO, सबसे अच्छा तरीका कुछ इस तरह है:

let ParseApplicationId = "xxx"
let ParseClientKey = "xxx"
let AppGreenColor = UIColor(red: 0.2, green: 0.7, blue: 0.3 alpha: 1.0)

@objc class Constant: NSObject {
    private init() {}

    class func parseApplicationId() -> String { return ParseApplicationId }
    class func parseClientKey() -> String { return ParseClientKey }
    class func appGreenColor() -> UIColor { return AppGreenColor }
}

ऑब्जेक्टिव-सी में, आप उन्हें इस तरह इस्तेमाल कर सकते हैं:

NSString *appklicationId = [Constant parseApplicationId];
NSString *clientKey = [Constant parseClientKey];
UIColor *greenColor = [Constant appGreenColor];

स्विफ्ट के लिए भी सुलभ?
कुषाण

@ सुखुण हां। सीधे पहुंच योग्य ParseClientKey, या कक्षा के माध्यम सेConstant.clientKey()
Fabian

7
का उपयोग करना चाहिए@objc class Constant: NSObject
विलियम हू

1
यह काम करता है, लेकिन स्विफ्ट 4 में, मुझे ऑब्जेक्ट सी कोड से उन्हें कॉल करने में सक्षम होने के लिए @objcप्रत्येक के सामने रखने की आवश्यकता है class func
इलेक्ट्रोबुधा

2
@ElectroBuddha आप @objcMembersपूरे क्लास को ऑब्जेक्टिव-सी कोड को प्रकट करने के लिए क्लास में कर सकते हैं ।
user1898712

19

structऔर ए दोनों के साथ फाइल क्यों नहीं बनाते हैं @objc class, कुछ इस तरह से:

import UIKit

extension UIColor {
    convenience init(hex: Int) {
        let components = (
            R: CGFloat((hex >> 16) & 0xff) / 255,
            G: CGFloat((hex >> 08) & 0xff) / 255,
            B: CGFloat((hex >> 00) & 0xff) / 255
        )
        self.init(red: components.R, green: components.G, blue: components.B, alpha: 1)
    }
}

extension CGColor {
    class func colorWithHex(hex: Int) -> CGColorRef {
        return UIColor(hex: hex).CGColor
    }
}

struct Constant {
    static let kParseApplicationId = "5678"
    static let kParseClientKey = "1234"
    static var kAppGreenColor: UIColor { return UIColor(hex:0x67B632) }
    static var kTextBlackColor: UIColor { return UIColor(hex:0x000000) }
    static var kSomeBgBlueColor: UIColor { return UIColor(hex:0x0000FF) }
    static var kLineGrayCGColor: CGColor { return CGColor.colorWithHex(0xCCCCCC) }
    static var kLineRedCGColor: CGColor { return CGColor.colorWithHex(0xFF0000) }
}


@objc class Constants: NSObject {
    private override init() {}

    class func parseApplicationId() -> String { return Constant.kParseApplicationId }
    class func parseClientKey() -> String { return Constant.kParseClientKey }
    class func appGreenColor() -> UIColor { return Constant.kAppGreenColor }
    class func textBlackColor() -> UIColor { return Constant.kTextBlackColor }
    class func someBgBlueColor() -> UIColor { return Constant.kSomeBgBlueColor }
    class func lineGrayCGColor() -> CGColor { return Constant.kLineGrayCGColor }
    class func lineRedCGColor() -> CGColor { return Constant.kLineRedCGColor }
}

जब आप स्थिरांक का उपयोग करने की आवश्यकता होती है तो ऑब्जेक्ट-सी फ़ाइलों में उपयोग के लिए इसे जोड़ें:

#import "ProjectModuleName-Swift.h"

स्विफ्ट का उपयोग:

self.view.backgroundColor = Constant.kAppGreenColor

उद्देश्य-सी उपयोग:

self.view.backgroundColor = [Constants appGreenColor];

इस तरह आप एक जगह में पूरे ऐप के लिए रंग, डिफ़ॉल्ट पाठ, वेब सेवा अपडेट कर सकते हैं।


1
यह तुरंत मेरे लिए स्पष्ट नहीं था कि हम उद्देश्य-सी भाग की खोज के लिए आपके उत्तर को स्क्रॉल कर सकें!
कूर

1

यदि आप केवल कक्षा के माध्यम से इन स्थिरांक का उपयोग करने के लिए अपने बयान में अन्य स्विफ्ट प्रकार बनाना चाहते हैं, तो आपको निजी बयान देना चाहिए:

private let AppGreenColor = UIColor(red: 0.2, green: 0.7, blue: 0.3 alpha: 1.0)

@objc class Constant {
    class func appGreenColor() -> UIColor { return AppGreenColor }
}

स्विफ्ट में, आप उन्हें इस तरह से उपयोग कर सकते हैं:

UIColor *greenColor = Constant.appGreenColor

निम्न पंक्ति अब संकलित नहीं होगी क्योंकि लेट स्टेटमेंट निजी है:

UIColor *greenColor = appGreenColor

1

हालांकि यह देर से या बेमानी हो सकता है, मैं इसे निम्नलिखित कोड के साथ काम कर सकता हूं:

@objcMembers class Flags: NSObject {
    static let abcEnabled = false
    static let pqrEnabled = false
    .
    .
    .
}

जाहिर है, objc c कोड में उपयोग करने के लिए, आपको #import "ProjectModuleName-Swa.b." करना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.