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

@interface GlobalConstants : NSObject

extern NSString *someNotification;

@end

@implementation GlobalConstants

NSString *someNotification = @"aaaaNotification";

@end

我如何在Swift中做完全相同的事情?


当前回答

我在Swift项目中所做的 1:新建Swift File 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"
    }

其他回答

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

let someNotification = "TEST"

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

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

或者只在GlobalConstants.swift中:

import Foundation

let someNotification = "aaaaNotification"

根据swift docs,全局变量是在文件作用域中声明的。

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

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

// Constants.swift

let SOME_NOTIF = "aaaaNotification"

从项目中的任何地方调用它,而不需要提及struct,enum或类名。

// MyViewController.swift

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

我认为这对于代码可读性来说更好。

对于通知,你可以使用扩展,像这样:

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

然后像NotificationCenter.default.post那样使用它(名称:.testNotification,对象:nil)

正如其他人所提到的,在类之外声明的任何东西都是全局的。

你也可以创建单例对象:

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

当你想要使用这个类中的一些东西时,你可以这样写:

TestClass.sharedInstance.number = 1

如果您现在从项目的任何地方写入println(TestClass.sharedInstance.number),您将向日志中输出1。这适用于所有类型的对象。

tl;dr:任何时候你想让一个类中的所有东西都是全局的,在类中添加静态let sharedInstance = YourClassName(),并用前缀YourClassName.sharedInstance来处理类的所有值