Swift 4中为何值会被添加对象指针前缀?
为什么Swift枚举数组打印时会带有对象指针前缀?
你看到的这个"前缀"其实不是对象指针,而是Swift枚举的完整类型限定名,我来给你拆解一下原因和解决办法:
原因分析
Swift中的关联值枚举(比如你定义的Token),默认的打印行为会输出它的完整类型路径——包括它所在的模块/命名空间。比如你在Playground或者LLDB调试环境下运行代码时,模块名会是类似__lldb_expr_1这种临时生成的名称,这就导致你打印数组时看到了__lldb_expr_1.Token.Number(1)这样的输出,看起来像是带了"指针前缀",但本质是Swift在明确告诉编译器/你这个枚举的具体归属。
这是因为Swift默认的CustomStringConvertible协议实现(用来生成打印字符串)会包含完整的类型信息,避免不同作用域下的同名类型混淆。
解决办法:自定义枚举的打印描述
让你的Token枚举遵循CustomStringConvertible协议,自己实现description属性,就能控制打印出来的内容了。修改后的代码如下:
enum Token: CustomStringConvertible { case Number(Int) case Minus case Plus // 自定义打印描述 var description: String { switch self { case .Number(let num): return "Number(\(num))" case .Minus: return "Minus" case .Plus: return "Plus" } } } var tokens = [Token]() for char in ["1","-","3","+","9"] { switch char { case "0"..."9": let digit = Int(String(char))! tokens.append(.Number(digit)) case "+": tokens.append(.Plus) case "-": tokens.append(.Minus) default: print("ends...") } } print(tokens) // 现在输出会是:[Number(1), Minus, Number(3), Plus, Number(9)]
额外小提示
如果只是在调试过程中想查看清晰的枚举内容,也可以直接用Xcode的调试面板查看,它会自动格式化显示枚举的内容,不需要修改代码。但如果是要在控制台输出友好的日志,自定义description是最可靠的方式。
另外,你当前的代码只能处理单个字符的数字,如果后续需要解析多位数字(比如"123"这样的字符串),还需要调整逻辑来拼接连续的数字字符,不过这就是另一个小任务啦😉
内容的提问来源于stack exchange,提问作者roman_ds
相关产品推荐
相关产品推荐

