【问题标题】:String interpolation of an enum produces "unknown()" string枚举的字符串插值产生“unknown()”字符串
【发布时间】:2018-09-18 18:36:26
【问题描述】:

简单的枚举和插值:

enum Test {
    case test1
    case test2
    case test3
}

let a = Test.test1
let b = "\(a)"

从调试窗口我得到:

a = (Test) test1
b = (String) "unknown()"

问题是这发生在我的项目中,而不是在操场上。

在项目中:

在操场上:

在日志中我得到:

SWIFT RUNTIME BUG: unable to find field metadata for type 'ProjectName.(unknown context at 0x10672213c).Test'

可能是什么问题?项目目标 iOS 是 9。我确实将项目转换为 swift 4.2。我在 XCode 10 测试版上遇到了这个问题,希望它会得到修复,但我想这不是 IDE 或 Swift 问题。

【问题讨论】:

  • 你知道enum是干什么用的吗?
  • 此时,b 尚未被赋值。您必须进入调试器中的下一行。
  • @MartinR 它已经在那里了。在步骤之前 - b = ""
  • print(b) 显示什么?可能只是调试器视图的显示问题。
  • @MartinR print(b) 打印 unknown()

标签: swift xcode10


【解决方案1】:

您需要确保启用“反射元数据级别”构建设置:

这个构建设置的描述可以在here找到:

反射元数据级别 (SWIFT_REFLECTION_METADATA_LEVEL)

此设置控制 Swift 编译器发出的反射元数据的级别。

  • 全部:有关 Swift 结构和类的存储属性、Swift 枚举案例及其名称的类型信息被发送到二进制文件中,以便在内存图调试器中进行反射和分析。
  • 无名称:仅将有关存储属性和案例的类型信息发送到二进制文件中,省略其名称。 -disable-reflection-names
  • 无:没有反射元数据被发送到二进制文件中。在 Memory Graph Debugger 中检测涉及 Swift 类型的内存问题的准确性将降低,并且 Swift 代码中的反射可能无法发现类型的子类型,例如属性和枚举案例。 -disable-reflection-metadata

【讨论】:

  • 谢谢。这是解决方案。出于某种原因,项目设置设置为All,但目标位于None
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多