অবজেক্টিভ-সি তে কীভাবে সুইফট স্ট্রাক্ট ব্যবহার করবেন


97

কেবলমাত্র আমার কাছে এমন স্ট্রাক্ট রয়েছে যা অ্যাপ্লিকেশন ধ্রুবকগুলি নীচের মতো সঞ্চয় করে:

struct Constant {

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

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

Constant.ParseClientKeyউদাহরণস্বরূপ কল করে এই ধ্রুবকগুলি সুইফ্ট কোডে ব্যবহার করা যেতে পারে । তবে আমার কোডে এটিতে কিছু উদ্দেশ্য-সি ক্লাসও রয়েছে। সুতরাং আমার প্রশ্নটি হল অবজেক্ট-সি কোডে এই ধ্রুবকগুলি কীভাবে ব্যবহার করবেন?

যদি কনস্ট্যান্টগুলি ঘোষণা করার উপায়টি ভাল না হয় তবে সুইফট এবং অবজেক্টিভ-সি কোড উভয় ক্ষেত্রে ব্যবহার করার জন্য বিশ্বব্যাপী ধ্রুবক তৈরি করার সর্বোত্তম উপায় কী?


22
দয়া করে সাধারণ সুইফ্ট কোড শৈলী অনুসরণ করুন এবং আপনার লেট / ভার সনাক্তকারী শুরুর জন্য একটি ছোট হাতের অক্ষর ব্যবহার করুন।
নিকোলাই রুহে

4
@ নিকোলাইরুহু কি কোনও স্ট্রাক্টের স্থিতিশীল বৈশিষ্ট্যের জন্য এটি সঠিক শৈলী নয়? অনেকটা পছন্দ UIControlEvents.TouchUpInside?
লুক রজার্স

4
@ নিকোলাইরুহে সুইফ্ট ঘোষণার দিকে একবার নজর দিন: বিকাশকারী.অ্যাপল. com/ লাইবারি / আইওস / ডকুমেন্টেশন / ইউআইকিট / রেফারেন্স /… - এটি অবশ্যই একটি কাঠামো।
লুক রজার্স

4
@ লুকরোগার্স হ'ল স্টাইল এনামগুলি কীভাবে আমদানি করতে হয় তা সুইফট ২.০ এর পরিবর্তিত পদ্ধতির কারণে NS_OPTIONS। শব্দার্থগতভাবে UIControlEventএখনও একটি গণনার ধরণ।
নিকোলাই রুহে

4
@ নিকোলাইরুহে লূকরোগার্স: দীন এই সমস্যাটি সম্পর্কে জিজ্ঞাসা করেননি এবং আমাদের বেশিরভাগ দর্শক এটি পড়তে এখানে ক্লিক করেননি।
original_username

উত্তর:


114

দুঃখের সাথে বলতে গেলে, আপনি প্রকাশ করতে পারবেন না struct, বা বিশ্বব্যাপী ভেরিয়েবলগুলি অবজেক্টিভ-সি তে প্রকাশ করতে পারবেন না । দেখতে ডকুমেন্টেশন

এখন অবধি, আইএমএইচও, সর্বোত্তম উপায় হ'ল এরকম কিছু:

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()
ফ্যাবিয়ান

7
ব্যবহার করা উচিত@objc class Constant: NSObject
উইলিয়াম হু

4
এটি কাজ করে তবে সুইফট 4-এ, আমি ওজেক্টিভ সি কোড থেকে তাদের কল করতে সক্ষম @objcহয়ে প্রত্যেকের সামনে রাখা দরকার class func
ইলেক্ট্রোবুদ্ধা 20'18

4
@ ইলেক্ট্রোবুদ্ধ আপনি @objcMembersক্লাসে উদ্দেশ্যটি-সি কোডের সাথে পুরো ক্লাসটি প্রকাশ করতে পারেন ।
ব্যবহারকারী 1898712

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];

এই ভাবে আপনি পুরো অ্যাপ্লিকেশনটির জন্য রঙ, ডিফল্ট পাঠ্য, ওয়েব পরিষেবা url এক জায়গায় আপডেট করতে পারবেন।


4
আমার কাছে তাত্ক্ষণিকভাবে পরিষ্কার ছিল না যে আমরা উদ্দেশ্য-সি অংশটি আবিষ্কার করতে আপনার উত্তরটি স্ক্রোল করতে পারি!
Cœur

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
    .
    .
    .
}

স্পষ্টতই, অবজেক্ট সি কোড ব্যবহার করতে আপনাকে # ইম্পোর্ট "প্রজেক্টমডিউলনাম-সুইফট। एच" করতে হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.