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

Objective-C中NSLog打印Swift枚举触发EXC_BAD_ACCESS如何解决?

崩溃原因

使用@objc标记桥接到Objective-C的Int类型Swift枚举,在OC侧属于值类型的NS_ENUM,本质是NSInteger基础数值类型,不是继承自NSObject的OC对象。
你之前的写法全部不符合类型规则:

  • 用%@格式符打印时,%@会把传入的参数当做OC对象指针,向其发送description消息,你传入的枚举整数值会被识别为非法内存地址,直接触发EXC_BAD_ACCESS内存访问崩溃
  • 尝试调用[operation description]、[operation value]会直接导致构建失败:基础数值类型不能接收OC消息,编译器会直接报语法错误
正确实现方式

打印枚举值

快速打印原始数值

枚举本身是整数类型,直接用%ld格式符打印即可,注意要强转为long类型兼容64位系统:

NSLog(@"Completed with operation raw value: %ld", (long)operation);

打印可读的case名称

桥接到OC后,Swift枚举的case会自动加上枚举名作为前缀,你定义的几个case在OC侧的枚举值分别是OperationUnknown、OperationOperation1、OperationOperation2、OperationOperation1And2,可以通过switch匹配返回对应字符串:

NSString *operationStr = nil;
switch (operation) {
    case OperationUnknown:
        operationStr = @"Unknown";
        break;
    case OperationOperation1:
        operationStr = @"Operation1";
        break;
    case OperationOperation2:
        operationStr = @"Operation2";
        break;
    case OperationOperation1And2:
        operationStr = @"Operation1And2";
        break;
    default:
        operationStr = [NSString stringWithFormat:@"Undefined operation: %ld", (long)operation];
        break;
}
NSLog(@"Completed with operation: %@", operationStr);

布尔比较操作

枚举值是基础数值,直接用==做比较即可,不需要调用任何对象方法:

// 判断是否为Operation1
BOOL isFirstOperation = (operation == OperationOperation1);
if (isFirstOperation) {
    // 对应业务逻辑
}

// 判断是否为Operation1和Operation2的组合
BOOL isCombinedOperation = (operation == OperationOperation1And2);
优化提示

如果后续需要频繁打印枚举值,可以直接在Swift侧给枚举扩展一个@objc的描述属性,桥接到OC后就可以直接调用拿到字符串,不用每次在OC侧写switch:

@objc extension Operation {
    var objcDescription: String {
        switch self {
        case .Unknown: return "Unknown"
        case .Operation1: return "Operation1"
        case .Operation2: return "Operation2"
        case .Operation1And2: return "Operation1And2"
        @unknown default: return "Invalid value: \(self.rawValue)"
        }
    }
}

桥接到OC后直接调用即可:

NSLog(@"Completed with operation: %@", [operation objcDescription]);

内容的提问来源于stack exchange,提问作者Dracula

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:21:46