全局常量文件在Swift中

use*_*028 322 objective-c ios swift

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

@interface GlobalConstants : NSObject

extern NSString *someNotification;

@end

@implementation GlobalConstants

NSString *someNotification = @"aaaaNotification";

@end
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*scu 739

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

struct Constants {
    static let someNotification = "TEST"
}
Run Code Online (Sandbox Code Playgroud)

然后,例如,在您的代码中将其称为:

print(Constants.someNotification)
Run Code Online (Sandbox Code Playgroud)

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

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

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

然后你可以使用例如 K.Path.Tmp

  • 就个人而言,我选择了一个带有分隔结构的`Constant.swift`文件,但没有封装在一个大的`Constants`结构中,以避免对常量调用太长时间.所以我称之为'NotificationKey.Welcome`而不是`Constants.NotificationKey.Welcome` (120认同)
  • 这与Objective-C代码不是交叉兼容的(结构,也没有为Objective-C导出顶级常量). (14认同)
  • 太棒了,这是最有条理的方式......特别是分段的子结构...... (3认同)
  • @brainray我看到了你的观点但是在我的代码中,常量永远不是本地的(总是在`Constants.swift`中)并且看起来总是一样的:以大写字母开头,并且有一个有意义的类别名称,如"NotificationKey","SegueIdentifier"或"路径",......所以我可以很容易地看到它是一个常数;) (3认同)
  • @VarunNaharia`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 (蓝色)/ 255.0,alpha:1)} static func IOS7VERSION() - > Bool {return UIDevice.currentDevice().systemVersion.compare("7.0",options:.NumericSearch,range:nil,locale:nil)!= .OrderedAscending}}` (3认同)
  • @KevinHirsch不是个坏主意.另一方面:如果我有.Constants前缀,我知道它不是本地的东西,而是在命名空间中的一种常量 (2认同)
  • 如何定义这些常量`#define IS_IPHONE_4S [[UIScreen mainScreen] bounds] .size.height == 480`,`#define IOS7VERSION([[[[UIDevice currentDevice] systemVersion] floatValue]> = 7.0?YES:NO)`, `#define RGBCOLOR(r,g,b)[UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1]` (2认同)
  • 静态变量不会在运行期间增加应用程序的大小,因为在应用程序开始运行时会加载所有静态变量。 (2认同)

LC *_*C 웃 102

我很晚才参加聚会.

无论在这里我是如何管理常量文件的,这样在使用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"
    }
}
Run Code Online (Sandbox Code Playgroud)

对于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"
    }
}
Run Code Online (Sandbox Code Playgroud)

适用于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"
        }
    }
Run Code Online (Sandbox Code Playgroud)

对于颜色常数:

//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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

还有更多观看此视频

  • 比我的回答更好 (2认同)
  • 在运行时,静态变量是否会增加应用程序的大小,因为在应用程序开始运行时会加载所有静态变量? (2认同)

Ant*_*nio 28

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

let someNotification = "TEST"
Run Code Online (Sandbox Code Playgroud)

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

建议阅读:全局变量和局部变量以及Swift中的全局变量不是变量


Kir*_*ela 20

Constant.swift

import Foundation

let kBaseURL = NSURL(string: "http://www.example.com/")
Run Code Online (Sandbox Code Playgroud)

ViewController.swift

var manager = AFHTTPRequestOperationManager(baseURL: kBaseURL)
Run Code Online (Sandbox Code Playgroud)

  • 在Objective-C中有一个常量模式,你将始终使用下一个格式声明它们:k + camel case属性的名称 (4认同)

Wil*_*ken 19

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

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

enum PhotoMetaKeys: String {
    case Orientation = "orientation_hv"
    case Size = "size"
    case DateTaken = "date_taken"
}
Run Code Online (Sandbox Code Playgroud)

当您处于互斥选项的情况时,会发生一个独特的好处,例如:

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
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,您将收到编译错误,因为您尚未处理该情况PhotoMetaKeys.DateTaken.

  • 枚举大小写不能包含重复值。所以这并不适合所有场景。 (2认同)

Chi*_*buZ 14

或者只是在GlobalConstants.swift中:

import Foundation

let someNotification = "aaaaNotification"
Run Code Online (Sandbox Code Playgroud)


Jac*_*b R 7

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

你也可以创建单身人士:

class TestClass {
    static let sharedInstance = TestClass()
    // Anything else goes here
    var number = 0
}
Run Code Online (Sandbox Code Playgroud)

任何时候你想要使用这个类的东西,你可以写:

TestClass.sharedInstance.number = 1
Run Code Online (Sandbox Code Playgroud)

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

tl; dr:任何时候你想让类中的所有内容都是全局的,添加static let sharedInstance = YourClassName()到类中,并使用前缀来解决类的所有值YourClassName.sharedInstance


Pra*_*kar 6

也可以使用无大小写枚举。

优点 - 它们不能被实例化。

enum API {
    enum Endpoint {
        static let url1 = "url1"
        static let url2 = "url2"
    }
    enum BaseURL {
        static let dev = "dev"
        static let prod = "prod"
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我在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"
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

为了在我的应用程序中使用全局常量,我在单独的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"
    }
}
Run Code Online (Sandbox Code Playgroud)

它很容易使用,并且可以像这样到处调用:

print(Config.Notifications.awareUser)
Run Code Online (Sandbox Code Playgroud)