let renderEncoderOpt = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor)
if let renderEncoder = renderEncoderOpt {
renderEncoder.setRenderPipelineState(pipelineState)
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, atIndex: 0)
renderEncoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1)
renderEncoder.endEncoding()
}
上面的代码抛出
Initializer for conditional binding must have Optional type, not 'MTLRenderCommandEncoder'
如果我尝试使renderEncoderOpt成为可选项,那么问题仍然存在。我已尝试使用guard let vs测试,如果让它,并尝试将其设置为可选项,并重新声明类型等,但它一直回到这个问题。这在swift 1 / 1.2
中工作正常有人有指针吗?
答案 0 :(得分:2)
renderCommandEncoderWithDescriptor
未返回可选项,因此您应完全删除if let
条件绑定,并直接使用结果。
let renderEncoder = commandBuffer.renderCommandEncoderWithDescriptor(renderPassDescriptor)
renderEncoder.setRenderPipelineState(pipelineState)
renderEncoder.setVertexBuffer(vertexBuffer, offset: 0, atIndex: 0)
renderEncoder.drawPrimitives(.Triangle, vertexStart: 0, vertexCount: 3, instanceCount: 1)
renderEncoder.endEncoding()
答案 1 :(得分:0)
罗布在评论中回答了这个问题。如果对象不是可选的,则不能使用if let
语法。这个错误告诉你。
答案 2 :(得分:0)
函数renderCommandEncoderWithDescriptor定义如下
func renderCommandEncoderWithDescriptor(_ renderPassDescriptor: MTLRenderPassDescriptor) -> MTLRenderCommandEncoder
返回类型MTLRenderCommandEncoder是一个图形渲染命令编码器对象,它是一个非可选对象。 (来源:https://developer.apple.com/library/prerelease/ios/documentation/Metal/Reference/MTLRenderCommandEncoder_Ref/index.html#//apple_ref/swift/intf/c:objc(pl)MTLRenderCommandEncoder)
因此,你的if条件绑定
if let renderEncoder = renderEncoderOpt {
失败。只需删除此if语句,您的代码就可以正常工作。