全局常量文件在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)