全局常量文件在Swift中

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

 @interface GlobalConstants : NSObject extern NSString *someNotification; @end @implementation GlobalConstants NSString *someNotification = @"aaaaNotification"; @end 

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

IMO处理这类常量的最好方法是创build一个Struct。

 struct Constants { static let someNotification = "TEST" } 

然后,例如,在你的代码中这样调用它:

 print(Constants.someNotification) 

编辑:如果你想要一个更好的组织,我build议你使用分段子结构

 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

我对这个晚会有点晚了。

不pipe这里是如何pipe理常量文件,以便在开发人员编写代码时更有意义。

对于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" } } 

对于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" } } 

适用于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" } } 

对于颜色常量:

 //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项目中名为常量的常用组中。

并观看更多的video

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

 let someNotification = "TEST" 

但是请注意,与局部variables/常量和类/结构属性不同,全局variables隐含地是惰性的,这意味着它们在被首次访问时被初始化。

build议阅读: 全局variables和局部variables ,以及Swift中的全局variables不是variables

Constant.swift

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

ViewController.swift

 var manager = AFHTTPRequestOperationManager(baseURL: kBaseURL) 

或者只是在GlobalConstants.swift中:

 import Foundation let someNotification = "aaaaNotification" 

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

 enum UserDefaultsKeys: String { case SomeNotification = "aaaaNotification" case DeviceToken = "deviceToken" } enum PhotoMetaKeys: String { case Orientation = "orientation_hv" case Size = "size" case DateTaken = "date_taken" } 

当您遇到相互排斥的select时,会有一个独特的好处,例如:

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

像其他人一样,在课堂之外宣布的东西是全球性的。

你也可以创build单身人士:

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

任何时候你想使用这个类的东西你例如写:

 TestClass.sharedInstance.number = 1 

如果您现在从项目中的任何位置编写println(TestClass.sharedInstance.number) ,则将打印1到日志中。 这适用于各种对象。

tl; dr:任何时候你想在全局类中创build所有的东西,向类中添加static let sharedInstance = YourClassName() ,并且使用前缀YourClassName.sharedInstance

颜色

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

对于其他 – 一切都在接受的答案相同。

我在Swift项目中做了什么
1:创build新的Swift文件
2:在其中创build一个结构和静态常量。
3:对于只使用YourStructName.baseURL

注意:创build初始化后需要很less的时间,所以它会在2-5秒后显示在其他视图控制器。

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

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

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

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