【问题标题】:Swift 1.2 optional external variable?Swift 1.2 可选的外部变量?
【发布时间】:2015-04-13 18:38:37
【问题描述】:

由于 Swift 无法访问编译变量,我创建了一个指向编译变量的目标 c extern 变量。

CompileVaribleConvertor.h

extern NSString * const NetworkApiBasicAuthUsername;

CompileVaribleConvertor.m

// AUTH_USERNAME might not be defined depending on the environment we are pointing to
#if defined(AUTH_USERNAME)
    NSString * const NetworkApiBasicAuthUsername = @AUTH_USERNAME;
#else
    NSString * const NetworkApiBasicAuthUsername = nil;
#endif

NetworkManager.swift

if CSNetworkApiAuthUsername != nil {
  // Basic auth is required set them
}

这段代码曾经在 Swift 1.0 上工作,但是 Swift 1.2 给出了编译错误。 二元运算符'!='不能应用于'String'和'nil'类型的操作数

如何使 extern 变量成为可选变量,我尝试将 extern 变量定义为 __nullable,但没有成功

【问题讨论】:

  • “由于 Swift 无法访问编译变量” 嗯,这不是真的,是吗?这取决于你想做什么。您可以在方案中设置环境变量并使用 NSProcessInfo 访问其值。并且 Swift 有一个 #if/#else/#endif 构造来测试是否定义了某些东西。
  • 如果您需要快速解决方案,只需使用空字符串即可。
  • @matt 应该更清楚,我的编译变量在构建设置下存储为“其他 C 标志”,如果我错了,请纠正我,但我相信 NSProcessInfo 无法访问它们。我不想将它们移动到方案设置,所以我最终根据 Sulthan 的建议在我的 if/else 宏中将值设置为空字符串

标签: ios swift


【解决方案1】:

我刚刚做了一些快速测试,我很确定这是一个错误。没有办法强制全局变量(或常量)为可选项。即使它们是用nil 初始化的。这不可能是正确的。

宏与错误无关。 作为一种解决方法,您可以使用函数而不是常量:

NSString* NetworkApiBasicAuthUsername() {
#if defined(AUTH_USERNAME)
    return @AUTH_USERNAME;
#else
    return nil;
#endif
}

【讨论】:

    猜你喜欢
    • 2016-01-22
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多