You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:54:06