- 发布:2026-03-18 09:04
- 更新:2026-03-18 09:05
- 阅读:19
【报Bug】自己写的Ios端的uts插件,用const定义的常量,编译成swift也是var
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: 版本 Windows 10 专业版 版本号 22H2 安装日期 2025/7/11 OS 内部版本 19045.6466
手机系统: 全部
页面类型: vue
vue版本: vue2
打包方式: 离线
项目创建方式: CLI
CLI版本号: 3.0.0-4060620250520001
测试过的手机:
操作步骤:
本地打包,生成本地打包资源
本地打包,生成本地打包资源
预期结果:
const 定义的应该是let
const 定义的应该是let
实际结果:
const 定义的实际编译成了var
const 定义的实际编译成了var
bug描述:
const targetSampleRate = 16000.0;
let channels = 1;
print("targetSampleRate", targetSampleRate)
print("channels", channels)
编译成swift代码,const 定义的应该是let,
由HBuilderX 4.66 版本生成
"@dcloudio/uni-app": "3.0.0-4060620250520001",
"@dcloudio/uni-app-harmony": "3.0.0-4060620250520001",
"@dcloudio/uni-app-plus": "3.0.0-4060620250520001",
"@dcloudio/uni-components": "3.0.0-4060620250520001",
"@dcloudio/uni-h5": "3.0.0-4060620250520001",
"vue": "^3.5.11",
"@dcloudio/types": "^3.4.29",
"@dcloudio/uni-automator": "3.0.0-4060620250520001",
"@dcloudio/uni-cli-shared": "3.0.0-4060620250520001",
"@dcloudio/uni-stacktracey": "3.0.0-4060620250520001",
"@dcloudio/uni-uts-v1": "3.0.0-4060620250520001",
"@dcloudio/vite-plugin-uni": "3.0.0-4060620250520001",
"@vue/runtime-core": "^3.4.21",
"sass": "1.77.0",
"typescript": "^5.9.3",
"vite": "5.2.8"
Ask小助手 - Ask社区AI助手
欢迎到专业群( uni-app x技术交流群 ) 咨询,群中有相关专业的管理员和群友。
这是一个有效且质量较高的 bug 反馈。以下是我作为官方技术人员对该反馈的详细评审:
1. 反馈内容完整性分析
优点:
- 标题清晰:准确指出了问题核心(UTS const 编译为 Swift var 而非 let)
- 版本信息完整:提供了 HBuilderX 4.66 及具体的 npm 包版本(3.0.0-4060620250520001),有助于定位问题版本
- 代码示例简洁有效:提供了最小可复现代码片段,能直接说明问题
- 平台信息明确:明确了 iOS 平台、Windows 开发环境、Vue2 项目类型
- 预期与实际结果对比明确:清楚说明了应该编译成
let实际编译成了var
建议补充的内容:
- 编译后的 Swift 代码片段:如果能提供
unpackage/dist/dev/.app-ios或生成的 swift 文件中对应的实际编译结果截图,将更有助于工程团队直接定位编译器代码生成阶段的问题 - 具体的插件路径:说明是在
uni_modules/xxx/utssdk/app-ios/index.uts中的代码,还是其他位置的 UTS 文件 - 打包方式:明确是"生成本地打包资源后在 Mac 上编译"还是"云打包"(虽然 Windows 上通常只能是前者)
2. Bug 成立性判断
该 Bug 成立。
依据知识库文档 README > 类型声明 > 常量定义(const) 明确说明:
"声明一个只读常量,只能为其赋值一次。语法
const [变量名] : [类型] = 值;。相当于 TypeScript 中的 const、kotlin 中的 val、swift 中的 let。"
文档同时特别强调了 Swift 与 UTS 的差异:
"swift 中 let 是定义常量,而 uts 和 ts 中,let 是定义变量。注意勿混淆。"
因此,UTS 中的 const 理应编译为 Swift 的 let,而用户反馈实际编译为 var,这属于编译器代码生成错误。
3. 问题严重程度与优先级评估
- 影响范围:影响所有在 UTS 插件中使用
const定义常量的 iOS 端开发者 - 潜在风险:
var允许重新赋值,可能导致常量被意外修改,违背开发者意图,可能引发运行时逻辑错误 - 版本情况:用户使用的是 4.66 版本,属于较新版本,需要确认该问题在最新 Alpha 版本(5.03)是否仍然存在
4. 处理建议
建议将此问题提交到官方 Issue 系统以便跟踪修复:
- 访问 https://issues.dcloud.net.cn 提交详细 issue
- 建议在 issue 中补充生成的 .swift 文件中的对应代码片段(可在
unpackage/dist/dev/.app-ios或生成的 iOS 工程中找到) - 如有可能,建议测试 HBuilderX Alpha 5.03 版本是否仍存在此问题(当前最新正式版为 5.03)
临时规避方案(基于知识库):
在问题修复前,如果担心 var 带来的可变风险,可以考虑在 UTS 代码中通过注释或命名规范(如全大写)来标记常量,避免在代码中重新赋值。但这只是权宜之计,不能解决编译器层面的问题。
结论:这是一个需要编译器团队修复的有效