সুইফটে গ্লোবাল কনস্ট্যান্ট ফাইল


336

আমার অবজেক্টিভ-সি প্রকল্পগুলিতে আমি প্রায়শই বিজ্ঞপ্তির নাম এবং কীগুলির মতো জিনিসগুলি সঞ্চয় করতে একটি বিশ্বব্যাপী ধ্রুবক ফাইল ব্যবহার করি NSUserDefaults। এটি দেখতে এমন কিছু দেখাচ্ছে:

@interface GlobalConstants : NSObject

extern NSString *someNotification;

@end

@implementation GlobalConstants

NSString *someNotification = @"aaaaNotification";

@end

আমি সুইফটে একই জিনিসটি কীভাবে করব?


উত্তর:


764

নেমস্পেস হিসাবে স্ট্রোকস

আইএমও এই ধরণের ধ্রুবকদের মোকাবেলা করার সেরা উপায় একটি স্ট্রাক্ট তৈরি করা।

struct Constants {
    static let someNotification = "TEST"
}

তারপরে, উদাহরণস্বরূপ, আপনার কোডটিতে এটিকে কল করুন:

print(Constants.someNotification)

পাখির

আপনি যদি আরও ভাল সংস্থা চান তবে আমি আপনাকে বিভাগযুক্ত সাব স্ট্রাক্ট ব্যবহার করার পরামর্শ দিচ্ছি

struct K {
    struct NotificationKey {
        static let Welcome = "kWelcomeNotif"
    }

    struct Path {
        static let Documents = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
        static let Tmp = NSTemporaryDirectory()
    }
}

তারপরে আপনি কেবল উদাহরণস্বরূপ ব্যবহার করতে পারেন K.Path.Tmp

বাস্তব বিশ্বের উদাহরণ

এটি কেবল একটি প্রযুক্তিগত সমাধান, আমার কোডটিতে আসল বাস্তবায়ন দেখতে আরও বেশি দেখাচ্ছে:

struct GraphicColors {

    static let grayDark = UIColor(0.2)
    static let grayUltraDark = UIColor(0.1)

    static let brown  = UIColor(rgb: 126, 99, 89)
    // etc.
}

এবং


enum Env: String {
    case debug
    case testFlight
    case appStore
}

struct App {
    struct Folders {
        static let documents: NSString = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as NSString
        static let temporary: NSString = NSTemporaryDirectory() as NSString
    }
    static let version: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
    static let build: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String

    // This is private because the use of 'appConfiguration' is preferred.
    private static let isTestFlight = Bundle.main.appStoreReceiptURL?.lastPathComponent == "sandboxReceipt"

    // This can be used to add debug statements.
    static var isDebug: Bool {
        #if DEBUG
        return true
        #else
        return false
        #endif
    }

    static var env: Env {
        if isDebug {
            return .debug
        } else if isTestFlight {
            return .testFlight
        } else {
            return .appStore
        }
    }
}

123
ব্যক্তিগতভাবে, আমি Constant.swiftপৃথক স্ট্রাক্ট সহ একটি ফাইলের জন্য গিয়েছিলাম তবে Constantsএকটি ধ্রুবকের কাছে খুব দীর্ঘ কল এড়াতে একটি বৃহত কাঠামোতে এনপ্যাপুলেটেড না । সুতরাং আমি এর NotificationKey.Welcomeপরিবর্তে কল করিConstants.NotificationKey.Welcome
কেভিন হির্চ

2
@ কেভিনহির্স একটি খারাপ ধারণা নয়। অন্যদিকে: যদি আমার কাছে .সন্তানদের উপসর্গ থাকে তবে আমি জানি যে এটি কোনও স্থানীয় জিনিস নয়, তবে নামস্থান
স্পেস

3
@ ব্রেনরে আমি আপনার বক্তব্যটি দেখছি তবে আমার কোড অনুসারে ধ্রুবকগুলি কখনই স্থানীয় হয় না (সর্বদা একটিতে থাকে Constants.swift) এবং সর্বদা একই রকম হয়: বড় হাতের অক্ষর দিয়ে শুরু হয় এবং "নোটিফিকেশনকি", "সেগিআইডেন্টিফায়ার" বা "পথ", .. এর মতো একটি অর্থবোধক বিভাগের নাম দিয়ে শুরু হয় .. । সুতরাং যখন এটি ধ্রুবক হয় তখন আমি সহজেই দেখতে পারি;)
কেভিন হির্চ

15
এটি ওজেক্টিভ-সি কোডের সাথে ক্রস-সামঞ্জস্যপূর্ণ নয় (স্ট্রাক্টস, না শীর্ষ-স্তরের ধ্রুবকগুলি উদ্দেশ্য-সি এর জন্য রফতানি করা হয়)।
RendmTsk

3
@ ভারুননাহারিয়াstruct Helpers { static func RGBCOLOR(red: Int, green: Int, blue: Int) -> UIColor { return UIColor(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: 1) } static func IOS7VERSION() -> Bool { return UIDevice.currentDevice().systemVersion.compare("7.0", options: .NumericSearch, range: nil, locale: nil) != .OrderedAscending } }
আন্দ্রে

109

আমি পার্টিতে দেরি করছি।

আমি কনস্ট্যান্টস ফাইলটি কীভাবে পরিচালনা করি তা এখানে গুরুত্বপূর্ণ নয় যাতে দ্রুতগতিতে কোড লেখার সময় এটি বিকাশকারীদের আরও বোধগম্য হয়।

ইউআরএল জন্য:

//URLConstants.swift

  struct APPURL {

    private struct Domains {
        static let Dev = "http://test-dev.cloudapp.net"
        static let UAT = "http://test-UAT.com"
        static let Local = "192.145.1.1"
        static let QA = "testAddress.qa.com"
    }

    private  struct Routes {
        static let Api = "/api/mobile"
    }

    private  static let Domain = Domains.Dev
    private  static let Route = Routes.Api
    private  static let BaseURL = Domain + Route

    static var FacebookLogin: String {
        return BaseURL  + "/auth/facebook"
    }
}

কাস্টমফন্টগুলির জন্য:

//FontsConstants.swift
struct FontNames {

    static let LatoName = "Lato"
    struct Lato {
        static let LatoBold = "Lato-Bold"
        static let LatoMedium = "Lato-Medium"
        static let LatoRegular = "Lato-Regular"
        static let LatoExtraBold = "Lato-ExtraBold"
    }
}

অ্যাপ্লিকেশন ব্যবহৃত সমস্ত কি জন্য

//KeyConstants.swift
    struct Key {

        static let DeviceType = "iOS"
        struct Beacon{
            static let ONEXUUID = "xxxx-xxxx-xxxx-xxxx"
        }

        struct UserDefaults {
            static let k_App_Running_FirstTime = "userRunningAppFirstTime"
        }

        struct Headers {
            static let Authorization = "Authorization"
            static let ContentType = "Content-Type"
        }
        struct Google{
            static let placesKey = "some key here"//for photos
            static let serverKey = "some key here"
        }

        struct ErrorMessage{
            static let listNotFound = "ERROR_LIST_NOT_FOUND"
            static let validationError = "ERROR_VALIDATION"
        }
    }

রঙের সংস্থাগুলির জন্য:

//ColorConstants.swift
struct AppColor {

    private struct Alphas {
        static let Opaque = CGFloat(1)
        static let SemiOpaque = CGFloat(0.8)
        static let SemiTransparent = CGFloat(0.5)
        static let Transparent = CGFloat(0.3)
    }

    static let appPrimaryColor =  UIColor.white.withAlphaComponent(Alphas.SemiOpaque)
    static let appSecondaryColor =  UIColor.blue.withAlphaComponent(Alphas.Opaque)

    struct TextColors {
        static let Error = AppColor.appSecondaryColor
        static let Success = UIColor(red: 0.1303, green: 0.9915, blue: 0.0233, alpha: Alphas.Opaque) 
    }

    struct TabBarColors{
        static let Selected = UIColor.white
        static let NotSelected = UIColor.black
    }

    struct OverlayColor {
        static let SemiTransparentBlack = UIColor.black.withAlphaComponent(Alphas.Transparent)
        static let SemiOpaque = UIColor.black.withAlphaComponent(Alphas.SemiOpaque)
        static let demoOverlay = UIColor.black.withAlphaComponent(0.6)
    }
}

আপনি আপনার এক্সকোড প্রকল্পে কনস্ট্যান্টস নামে একটি সাধারণ গ্রুপে এই সমস্ত ফাইলগুলি মোড়ানো করতে পারেন ।

এবং আরও জন্য এই ভিডিওটি দেখুন


ধন্যবাদ, আমি আপনার পদ্ধতিটি সর্বাধিক সুবিধাজনক বলে মনে করেছি (কমপক্ষে আমার জন্য), খুব ভাল! 8)
ইয়াতকো

2
আমার উত্তর চেয়ে ভাল
কিরীট ওয়াঘেলা

1
ইউআইকিট আমদানি করতে ভুলবেন না :)
আলিকানবাতুর

2
স্ট্যাটিক ভেরিয়েবলগুলি রান চলাকালীন সময়ে অ্যাপটির আকার বাড়ে না কেন অ্যাপটি চলতে শুরু করে সমস্ত স্থির ভেরিয়েবল লোড হয়?
আনন্দ

1
আমি জানি এটি এক বছরেরও বেশি পুরানো, তবে কেবল এটিই চমত্কার বলতে চাই। এই the
ব্যবহারকারী 1898712

28

যদিও আমি @ ফ্রেঞ্চেস্কুর পথটিকে পছন্দ করি (স্থিতিশীল বৈশিষ্ট্যযুক্ত কাঠামো ব্যবহার করে), আপনি বৈশ্বিক ধ্রুবক এবং ভেরিয়েবলগুলিও সংজ্ঞা দিতে পারেন:

let someNotification = "TEST"

তবে নোট করুন যে স্থানীয় ভেরিয়েবল / ধ্রুবক এবং শ্রেণি / কাঠামোর বৈশিষ্ট্যগুলি থেকে পৃথকভাবে, গ্লোবালগুলি স্পষ্টতই অলস হয়, যার অর্থ তারা যখন প্রথমবার অ্যাক্সেস করা হয় তখন সেগুলি আরম্ভ করা হয়।

প্রস্তাবিত পাঠ: গ্লোবাল এবং স্থানীয় ভেরিয়েবল , এবং এছাড়াও সুইফট গ্লোবাল ভেরিয়েবল ভেরিয়েবল নয়


এই ধ্রুবকগুলি ঘোষণার সঠিক উপায়। কাঠামো পদ্ধতির পাঠযোগ্যতার জন্য খুব ভাল।
জোও নুনস

1
আমি এই পদ্ধতির সুপারিশ করি না কারণ এটি ওওপি নীতিটিকে সমর্থন করে..আপনি
আনিস পারাজুলি 웃

1
@ থাট্লাজিয়োসগুই ift সুইফ্ট একটি ওওপি ভাষা তবে ফাংশনাল প্রোগ্রামিংয়ের দিকেও মনোনিবেশ করা (কমপক্ষে আরও কার্যকরী ধারণা)। ধ্রুবকগুলি ঘোষণার জন্য এটি একটি পুরোপুরি বৈধ উপায় যদিও এটি কোনও আইডিইর জন্য স্ট্রিং নেমস্পেসকে কঠোরভাবে ক্লাউড করবে।
ডিন কেলি 21

আপনি বলছেন যে পার্থক্য নিখরচুর আলস্য মধ্যে রয়েছে তবে আপনি যদি কোনও গণিত স্ট্যাটিক ভার ব্যবহার করেন তবে এটি একইভাবে বিশ্বব্যাপী একইভাবে কাজ করবে এবং একবার এবং কেবল একবার ডেকে পাঠানো হবে।
ডিন কেলি

1
অপেক্ষা করুন, তবে সম্ভাব্য সমস্যাটি হ'ল স্ট্রাকটি মান ধরণের, শ্রেণিটি রেফারেন্স টাইপ, স্ট্রাক্টে শ্রেণীর উদাহরণ বরাদ্দকরণ শ্রেণীর মানকে ধরণে বিভক্ত করবে, যা অনাকাঙ্ক্ষিত ??
মার্টিয়ান2049

23

Constant.swift

import Foundation

let kBaseURL = NSURL(string: "http://www.example.com/")

ViewController.swift

var manager = AFHTTPRequestOperationManager(baseURL: kBaseURL)

কী কারণে BASEURL এর পরিবর্তে kBaseURL ব্যবহার করে? ধন্যবাদ!
জোসেপ এসকোবার

সম্ভবত তিনি অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলিও বিকাশ করছেন এবং এটি একটি অ্যান্ড্রয়েড স্ট্যান্ডার্ড।
বোরাণা

5
অবজেক্টিভ-সি-তে ধ্রুবকদের জন্য একটি প্যাটার্ন রয়েছে, আপনি সর্বদা তাদের পরবর্তী ফর্ম্যাটটি ব্যবহার করে ঘোষণা করবেন: সম্পত্তি + কে + উটের মামলার নাম
লর স্টেফান

20

গণনা বিবেচনা করুন। এগুলি পৃথক ব্যবহারের ক্ষেত্রে যুক্তিসঙ্গতভাবে ভাঙা যায়।

enum UserDefaultsKeys: String {
    case SomeNotification = "aaaaNotification"
    case DeviceToken = "deviceToken"
}

enum PhotoMetaKeys: String {
    case Orientation = "orientation_hv"
    case Size = "size"
    case DateTaken = "date_taken"
}

একটি অনন্য সুবিধা যখন ঘটে যখন আপনার পারস্পরিক একচেটিয়া বিকল্পগুলির পরিস্থিতি থাকে, যেমন:

for (key, value) in photoConfigurationFile {
    guard let key = PhotoMetaKeys(rawvalue: key) else {
        continue // invalid key, ignore it
    }
    switch (key) {
    case.Orientation: {
        photo.orientation = value
    }
    case.Size: {
        photo.size = value
    }
    }
}

এই উদাহরণে, আপনি একটি সংকলন ত্রুটি পাবেন কারণ আপনি কেসটি পরিচালনা করেন নি PhotoMetaKeys.DateTaken


1
এনুম কেস সদৃশ মান ধরে রাখতে পারে না। সুতরাং এটি সমস্ত পরিস্থিতিতে ফিট করে না।
আইনা জৈন

@ আইনাজাইন প্রকৃতপক্ষে, যদি এনাম কাঁচা মানের পরিবর্তে গুণিত বৈশিষ্ট্যগুলি ব্যবহার করা হয় তবে বিভিন্ন এনাম ক্ষেত্রে একই মান আউটপুট পাওয়া সহজ।
ভবিষ্যতে-আদম

14

অথবা কেবল গ্লোবাল কনস্ট্যান্টস.ইউফিটে:

import Foundation

let someNotification = "aaaaNotification"

8

অন্যরা যেমন উল্লেখ করেছেন, শ্রেণীর বাইরে ঘোষিত যে কোনও কিছুই বিশ্বব্যাপী।

আপনি সিলেটলেটও তৈরি করতে পারেন:

class TestClass {
    static let sharedInstance = TestClass()
    // Anything else goes here
    var number = 0
}

আপনি যখনই এই ক্লাস থেকে কিছু ব্যবহার করতে চান, আপনি যেমন:

TestClass.sharedInstance.number = 1

আপনি যদি এখন println(TestClass.sharedInstance.number)আপনার প্রকল্পের যে কোনও জায়গা থেকে লিখেন তবে আপনি 1লগে মুদ্রণ করবেন। এটি সমস্ত ধরণের অবজেক্টের জন্য কাজ করে।

tl; dr: যে কোনও সময় আপনি ক্লাসে সমস্ত কিছু বিশ্বব্যাপী তৈরি করতে চান, শ্রেণিতে যুক্ত static let sharedInstance = YourClassName()করুন এবং শ্রেণির সমস্ত মানকে উপসর্গ দিয়ে সম্বোধন করুনYourClassName.sharedInstance


আপনার জন্য একটি প্রশ্ন অন্যান্য উত্তরগুলি তথ্য সংরক্ষণের জন্য স্ট্রাক ব্যবহার করে জড়িত, তবে সম্ভাব্য সমস্যাটি হ'ল স্ট্রাকটি মান ধরণের, শ্রেণিটি রেফারেন্স টাইপ, স্ট্রাক্টে শ্রেণীর উদাহরণ নির্ধারণের সাথে শ্রেণীর মানকে ধরণে বিভক্ত করবে, যা অনাকাঙ্ক্ষিত, তাই না?
মার্টিয়ান2049

5

আমি আমার সুইফট প্রকল্পে যা করেছি
1: নতুন সুইফট ফাইল
2 তৈরি করুন: এতে একটি স্ট্রাক্ট এবং স্ট্যাটিক ধ্রুবক তৈরি করুন।
3: কেবল আপনার স্ট্রাস্টনাম.বেস URL ব্যবহার করার জন্য

দ্রষ্টব্য: সূচনা তৈরির পরে কিছুটা সময় নেয় তাই এটি 2-5 সেকেন্ড পরে অন্য ভিউকন্ট্রোলারে প্রদর্শিত হবে।

import Foundation

    struct YourStructName {
    static let MerchantID = "XXX"
    static let MerchantUsername = "XXXXX"
    static let ImageBaseURL = "XXXXXXX"
    static let baseURL = "XXXXXXX"
    }

3

বিজ্ঞপ্তিগুলির জন্য আপনি এক্সটেনশনটি ব্যবহার করতে পারেন, এরকম কিছু:

extension Notification.Name {
    static let testNotification = "kTestNotification"
}

এবং এটি ব্যবহার করুন NotificationCenter.default.post(name: .testNotification, object: nil)


2

আমার অ্যাপ্লিকেশনগুলিতে গ্লোবাল ধ্রুবক থাকতে, আমি এটি একটি পৃথক সুইফ্ট ফাইলটিতে করি:

import Foundation

struct Config {
    static let baseURL = "https://api.com"

    static APIKeys {
        static let token = "token"
        static let user = "user"
    }

    struct Notifications {
        static let awareUser = "aware_user"
    }
}

এটি ব্যবহার করা সহজ এবং সর্বত্র এই জাতীয়ভাবে কল করা:

print(Config.Notifications.awareUser)

1

রং

extension UIColor {
    static var greenLaPalma: UIColor {
        return UIColor(red:0.28, green:0.56, blue:0.22, alpha:1.00)
    }
}

ফন্ট

enum CustomFontType: String {
    case avenirNextRegular = "AvenirNext-Regular",
    avenirDemiBold = "AvenirNext-DemiBold"
}

extension UIFont {
    static func getFont(with type: CustomFontType, size: CGFloat) -> UIFont {
        let font = UIFont(name: type.rawValue, size: size)!

        return font
    }
}

অন্যান্যদের জন্য - গৃহীত উত্তরের মতো সবকিছু।


1

সুইফ্ট ডক্স অনুসারে গ্লোবাল ভেরিয়েবলগুলি ফাইল স্কোপে ঘোষণা করা হয়।

গ্লোবাল ভেরিয়েবলগুলি এমন ভেরিয়েবল যা কোনও ফাংশন, পদ্ধতি, সমাপনী বা প্রসঙ্গে প্রসঙ্গের বাইরে সংজ্ঞায়িত হয়

কেবল একটি সুইফ্ট ফাইল তৈরি করুন (উদা: কনস্ট্যান্টস.উইফ্ট) এবং সেখানে আপনার ধ্রুবকগুলি ঘোষণা করুন:

// Constants.swift

let SOME_NOTIF = "aaaaNotification"

এবং আপনার প্রকল্পের যে কোনও জায়গা থেকে স্ট্রাক্ট, এনাম বা শ্রেণীর নাম উল্লেখ না করে কল করুন।

// MyViewController.swift

NotificationCenter.default.post(name: SOME_NOTIF, object: nil)

আমি মনে করি কোড পাঠযোগ্যতার জন্য এটি আরও ভাল।


1

সুইফট 4 সংস্করণ

আপনি যদি নোটিফিকেশন সেন্টারের জন্য একটি নাম তৈরি করতে চান:

extension Notification.Name {
    static let updateDataList1 = Notification.Name("updateDataList1")
}

বিজ্ঞপ্তিগুলিতে সাবস্ক্রাইব করুন:

NotificationCenter.default.addObserver(self, selector: #selector(youFunction), name: .updateDataList1, object: nil)

বিজ্ঞপ্তি পাঠান:

NotificationCenter.default.post(name: .updateDataList1, object: nil)

আপনি যদি ভেরিয়েবলের সাথে ক্লাসটি ব্যবহার করতে চান তবে:

class Keys {
    static let key1 = "YOU_KEY"
    static let key2 = "YOU_KEY"
}

বা:

struct Keys {
    static let key1 = "YOU_KEY"
    static let key2 = "YOU_KEY"
}

1

কেসলেস এনামগুলিও ব্যবহার করা যেতে পারে।

সুবিধা - এগুলি তাত্ক্ষণিকভাবে চালু করা যায় না।

enum API {
    enum Endpoint {
        static let url1 = "url1"
        static let url2 = "url2"
    }
    enum BaseURL {
        static let dev = "dev"
        static let prod = "prod"
    }
}

0

অ্যাপল থেকে শিখাই ভাল উপায়।

উদাহরণস্বরূপ, অ্যাপলের কীবোর্ড বিজ্ঞপ্তি:

extension UIResponder {

    public class let keyboardWillShowNotification: NSNotification.Name

    public class let keyboardDidShowNotification: NSNotification.Name

    public class let keyboardWillHideNotification: NSNotification.Name

    public class let keyboardDidHideNotification: NSNotification.Name

}

এখন আমি অ্যাপলের কাছ থেকে শিখছি:

extension User {
    /// user did login notification
    static let userDidLogInNotification = Notification.Name(rawValue: "User.userDidLogInNotification")
}

আরও কি NSAttributedString.Key.foregroundColor,:

extension NSAttributedString {

    public struct Key : Hashable, Equatable, RawRepresentable {

        public init(_ rawValue: String)

        public init(rawValue: String)
    }
}

extension NSAttributedString.Key {

    /************************ Attributes ************************/

    @available(iOS 6.0, *)
    public static let foregroundColor: NSAttributedString.Key // UIColor, default blackColor

}

এখন আমি ফর্ম অ্যাপল শিখি:

extension UIFont {

    struct Name {

    }

}

extension UIFont.Name {

    static let SFProText_Heavy = "SFProText-Heavy"
    static let SFProText_LightItalic = "SFProText-LightItalic"
    static let SFProText_HeavyItalic = "SFProText-HeavyItalic"

}

ব্যবহার:

let font = UIFont.init(name: UIFont.Name.SFProText_Heavy, size: 20)

অ্যাপল থেকে শিখুন যেভাবে সবাই করতে পারে এবং সহজেই আপনার কোডের গুণমান প্রচার করতে পারে।

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