Answers:
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
这只是一个技术解决方案,我的代码中的实际实现看起来更像:
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
}
}
}
Constant.swift
具有分开的结构的文件,但是没有封装在一个大的Constants
结构中,以避免对一个常量的调用太长。于是我打电话NotificationKey.Welcome
,而不是Constants.NotificationKey.Welcome
Constants.swift
),并且始终看起来是相同的:以大写字母开头,并使用有意义的类别名称,例如“ NotificationKey”,“ SegueIdentifier”或“ Path”,.. 。因此,当它为常数时,我可以很容易地看到它;)
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 } }
我晚会迟到了。
无论如何,这都是我如何管理常量文件,以便在快速编写代码时对开发人员来说更有意义。
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"
}
}
对于自定义字体:
//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)
}
}
您可以将所有这些文件包装在Xcode项目中的名为Constants的通用组中。
有关更多信息,请观看此视频
尽管我更喜欢@Francescu的方式(使用具有静态属性的结构),但是您也可以定义全局常量和变量:
let someNotification = "TEST"
但是请注意,与局部变量/常量和类/结构属性不同,全局变量是隐式惰性的,这意味着它们在首次访问时会被初始化。
建议阅读:全局和局部变量,以及Swift中的全局变量都不是变量
恒速
import Foundation
let kBaseURL = NSURL(string: "http://www.example.com/")
ViewController.swift
var manager = AFHTTPRequestOperationManager(baseURL: kBaseURL)
考虑枚举。对于单独的用例,可以将这些逻辑上分解。
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
。
就像其他人提到的那样,在类之外声明的任何东西都是全局的。
您还可以创建单例:
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
我在Swift项目
1中所做的工作:创建新的Swift文件
2:在其中创建结构和静态常量。
3:对于使用,只需使用YourStructName.baseURL
注意:创建初始化后,只需花费很少的时间,因此它将在2-5秒后显示在其他视图控制器中。
import Foundation
struct YourStructName {
static let MerchantID = "XXX"
static let MerchantUsername = "XXXXX"
static let ImageBaseURL = "XXXXXXX"
static let baseURL = "XXXXXXX"
}
为了在我的应用程序中具有全局常量,这是我在单独的Swift文件中执行的操作:
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)
色彩
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文件(例如:Constnats.swift),然后在其中声明常量即可:
// Constants.swift
let SOME_NOTIF = "aaaaNotification"
并从项目中的任何位置调用它,而无需提及struct,enum或类名。
// MyViewController.swift
NotificationCenter.default.post(name: SOME_NOTIF, object: nil)
我认为这对于代码可读性来说要好得多。
Swift 4版本
如果要为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"
}
也可以使用无大小写的枚举。
优点-无法实例化它们。
enum API {
enum Endpoint {
static let url1 = "url1"
static let url2 = "url2"
}
enum BaseURL {
static let dev = "dev"
static let prod = "prod"
}
}
向苹果学习是最好的方法。
例如,Apple的键盘通知:
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)
向苹果学习是每个人都可以做的事情,并且可以轻松地提高代码质量。