如何遍历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
相关产品推荐
相关产品推荐

