当前位置: 首页 > 知识库问答 >
问题:

Swift中的全球常数文件

秦涵涤
2023-03-14

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

@interface GlobalConstants : NSObject

extern NSString *someNotification;

@end

@implementation GlobalConstants

NSString *someNotification = @"aaaaNotification";

@end

如何在 Swift 中执行完全相同的操作?

共有3个答案

景育
2023-03-14

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

let someNotification = "TEST"

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

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

农飞翔
2023-03-14

我参加聚会有点晚了。

无论以下是我如何管理常量文件,以便在以swift编写代码时对开发人员更有意义。

对于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项目中名为常量的公共组中。

更多信息,请观看此视频

班建义
2023-03-14

IMO处理此类常量的最佳方法是创建一个结构。

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

然后你可以使用例如< code>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
        }
    }
}
 类似资料:
  • 问题内容: 在我的Objective-C项目中,我经常使用全局常量文件来存储诸如通知名称和的键之类的东西。看起来像这样: 在Swift中,我该怎么做? 问题答案: IMO处理此类常量的最佳方法是创建Struct。 然后,例如,在您的代码中这样调用它: 套料 如果您想要一个更好的组织,我建议您使用分段的子结构 然后您可以使用例如 现实世界的例子 这只是一个技术解决方案,我的代码中的实际实现看起来更像

  • 问题内容: 经过寻找一些参考的数字出来,-unfortunately-我找不到任何关于理解之间的差异有用-和简单- 描述和。当试图了解我们应该如何使用它们时,这有点令人困惑。 我要说的是,我对-default-最为熟悉,它具有传播错误的最简单形式,如下所示: 到目前为止还不错,但是在以下情况下会出现问题: 到目前为止我所知道的是当调用一个函数时必须由a处理,与。所以呢?!在决定使用或时应遵循的逻辑

  • 问题内容: 我该怎么做: 在全球范围内,就像在主应用程序或功能中一样,是否有任何iFrame,img src等都可以使用? Docs在解释这一点方面很差。 问题答案: 我只是阅读了您先前回答中的评论。不知道您是否找到解决方案。似乎您在寻找事物的白名单类型。最近,我发现$ sce有一个白名单功能。 摘自AngularJS文档中的$ sceDelegateProvider : 有了这个,您可以像这样在

  • 我正在尝试将变量DB设置为全局并在任何地方使用。我的问题是我正在初始化两倍的db。在基本控制器和附件中。即: 和 我只想创建一次var db,并访问项目中的任何地方。我该怎么做?

  • 问题内容: 我是gulp.js的新用户。我想将所有非JavaScript文件都移至构建目录。我现在得到的是: 如您所见,它只匹配文件路径字符串中的第一个点,而不是我想要的最后一个。如何修改全局搜索字符串以使其符合我的要求? 问题答案: 尝试以下glob模式:

  •        在“视图”菜单栏中“视图角度”栏点击“全球视图”可以迅速切换到全球视图视角。