斯威夫特快速2后卫让

时间:2015-12-07 00:08:35

标签: swift

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

中工作正常

有人有指针吗?

3 个答案:

答案 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

(来源:https://developer.apple.com/library/prerelease/ios/documentation/Metal/Reference/MTLCommandBuffer_Ref/index.html#//apple_ref/occ/intfm/MTLCommandBuffer/renderCommandEncoderWithDescriptor:)

返回类型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语句,您的代码就可以正常工作。