对于下面的代码:

let services: [MyServices] = [
    MyService(),
    #if DEBUG
    DebugService(),
    #endif
]

我收到编译器错误:

表达式无法解析: 错误:MyPlayound.playround:375:5:错误:容器文本中需要表达式 #IF DEBUG ^

错误:MyPlayarg.playround:376:19:错误:一行上的连续语句必须用‘;’分隔 DebugService()、 ^ ;

错误:MyPlayound.playround:376:19:错误:预期的表达式 DebugService()、 ^

错误:MyPlayound.playround:378:1:错误:预期的表达式 ]

但同样的代码可以在Objective-C中运行

NSArray *array = @[
        @"11",
    #if DEBUG
        @"debug",
    #endif
        @"22"
    ];

这是编译器错误还是预期行为?谢谢.

推荐答案

通常,#if ... #else ... #endif编译器指令中每个子句的主体必须包含完整的语句.

但随着SWIFT 5.5中SE-308 #if for postfix member expressions的实现,该指令已经扩展到能够用后缀成员表达式括起来.

因此,使用自定义扩展

extension Array {
    func appending(_ e: Element) -> Self {
        return self + [e]
    }
}

可以有条件地初始化一个数组,如下所示:

let services = [
    MyService() ]
#if DEBUG
    .appending(DebugService())
#endif

Swift相关问答推荐

.onReceive NSWindow.CloseNotify是否会为App中的每个窗口调用?

Swift ui 转换无法按预期工作

关闭 SwiftUI TabView 中的子视图

当模式以编程方式关闭时在父视图控制器中触发操作

在表单中对齐文本框

从 Int 到 String 的属性更改引发 SwiftUI 视图不更新

闭包 - deinit self 对象的时间

为什么 SwiftUI 不在工具栏菜单中反映 @State 属性值?

Swift 有没有办法在不使用 switch 语句的情况下获取关联值?

如何让不同的组件拥有不同的动画?

为什么swiftui中的导航视图栏那么大?

Swift中的分段错误

临时添加到视图层次 struct 后,Weak view引用不会被释放

如何在 Swift 中将对象归零

Swift if 语句 - 多个条件用逗号分隔?

将活动指示器 colored颜色 更改为黑色

Swift中字节数组的NSData

在 xcode8 中找不到 ModuleName-Swift.h 文件

迭代 Firebase 中的子快照

无法将 NSAttributedString.DocumentAttributeKey 类型的值转换为 .DocumentReadingOptionKey