首页 文章

全局常量文件在Swift中

提问于
浏览
301

在我的Objective-C项目中,我经常使用全局常量文件来存储 NSUserDefaults 的通知名称和键等内容 . 它看起来像这样:

@interface GlobalConstants : NSObject

extern NSString *someNotification;

@end

@implementation GlobalConstants

NSString *someNotification = @"aaaaNotification";

@end

我如何在Swift中做同样的事情?

12 回答

  • 20

    IMO处理这种常量的最好方法是创建一个Struct .

    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

  • 2

    Swift 4 Version

    如果要为NotificationCenter创建名称:

    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"
    }
    
  • 28

    I am abit late to the party.

    无论在这里我是如何管理常量文件的,这样在使用swift编写代码时对开发人员更有意义 .

    FOR URL:

    //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"
        }
    }
    

    For CUSTOMFONTS:

    //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"
        }
    }
    

    FOR ALL THE KEYS USED IN APP

    //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"
            }
        }
    

    FOR COLOR CONSTANTS:

    //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)
        }
    }
    

    您可以将这些所有文件包装在Xcode项目中名为 Constants 的公共组中 .

    而且更多观看这个video

  • 14

    虽然我更喜欢@Francescu的方式(使用带静态属性的结构),但您也可以定义全局常量和变量:

    let someNotification = "TEST"
    

    但请注意,与局部变量/常量和类/结构属性不同,全局变量是隐式延迟的,这意味着它们在第一次访问时会被初始化 .

    建议阅读:Global and Local Variables,以及Global variables in Swift are not variables

  • 0

    Constant.swift

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

    ViewController.swift

    var manager = AFHTTPRequestOperationManager(baseURL: kBaseURL)
    
  • 18

    考虑枚举 . 这些可以在逻辑上分解为单独的用例 .

    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 的情况 .

  • 86

    或者只是在GlobalConstants.swift中:

    import Foundation
    
    let someNotification = "aaaaNotification"
    
  • 6

    像其他人一样提到在课堂外宣布的任何事情都是全球性

    你也可以创建单身人士:

    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 寻址该类的所有值

  • 1

    我在Swift项目中做了什么
    1:创建新的Swift文件
    2:在其中创建结构和静态常量 .
    3:For Using只使用YourStructName.baseURL

    注意:创建初始化后需要很少的时间,因此它会在2-5秒后显示在其他视图控制器中 .

    import Foundation
    
        struct YourStructName {
        static let MerchantID = "XXX"
        static let MerchantUsername = "XXXXX"
        static let ImageBaseURL = "XXXXXXX"
        static let baseURL = "XXXXXXX"
        }
    
  • 4

    对于通知,您可以使用扩展名,如下所示:

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

    并像 NotificationCenter.default.post(name: .testNotification, object: nil) 一样使用它

  • 706

    Colors

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

    Fonts

    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

    根据swift docs全局变量在文件范围内声明 .

    全局变量是在任何函数,方法,闭包或类型上下文之外定义的变量

    只需创建一个swift文件(例如:Constnats.swift)并在那里声明你的常量:

    // Constants.swift
    
    let SOME_NOTIF = "aaaaNotification"
    

    并从项目的任何地方调用它,而无需提及struct,enum或class name .

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

    我认为这对于代码可读性来说要好得多 .

相关问题