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

如何遍历MTKMesh的非空vertexBuffers数组元素并绑定顶点缓冲区?

正确遍历MTKMesh.vertexBuffers的非空元素

问题出在Objective-C到Swift的桥接特性上:虽然MTKMesh.vertexBuffers的Swift声明是[MTKMeshBuffer],但底层是Objective-C的NSArray,其中确实可能混入NSNull实例(对应文档描述的“未指定元素的缓冲区位置”)。你之前的代码错误在于直接将数组元素当作MTKMeshBuffer类型进行判断,编译器自然会抛出类型不匹配的警告。

正确的处理方式

可以通过类型转换检查来筛选出有效的MTKMeshBuffer实例:

for (bufferIndex, element) in mesh.vertexBuffers.enumerated() {
    // 尝试将元素转换为MTKMeshBuffer,失败则跳过(说明是NSNull)
    guard let vertexBuffer = element as? MTKMeshBuffer else {
        continue
    }
    renderEncoder.setVertexBuffer(vertexBuffer.buffer, offset: vertexBuffer.offset, index: bufferIndex)
}

或者也可以直接判断元素是否为NSNull(这种方式需要强制转换,适合你明确知道非NSNull元素一定是MTKMeshBuffer的场景):

for (bufferIndex, element) in mesh.vertexBuffers.enumerated() {
    if element is NSNull {
        continue
    }
    let vertexBuffer = element as! MTKMeshBuffer
    renderEncoder.setVertexBuffer(vertexBuffer.buffer, offset: vertexBuffer.offset, index: bufferIndex)
}

为什么之前的代码会报错

  • 第一个代码里,vertexBuffer被编译器推断为MTKMeshBuffer类型,而MTKMeshBuffer和NSNull是完全无关的类型,所以is NSNull的判断永远为false,触发警告。
  • 第二个代码里,vertexBuffer是非可选类型,和nil比较没有意义,因为非可选值永远不会是nil,所以编译器提示警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:05:33