Swift错误:无法将不可变值作为inout参数传递:“pChData”是一个“let”常量。

11

我有一个函数长这样:

func receivedData(pChData: UInt8, andLength len: CInt) {
    var receivedData: Byte = Byte()
    var receivedDataLength: CInt = 0

    memcpy(&receivedData, &pChData, Int(len));  // Getting the error here
    receivedDataLength = len
    AudioHandler.sharedInstance.receiverAudio(&receivedData, WithLen: receivedDataLength)
}

出现错误:

无法将不可变值传递为inout参数:'pChData'是'let'常量

Xcode 屏幕截图

尽管我传递的参数中没有一个是let常量。为什么会发生这种情况?


memcpy() 函数在哪里? - Harshal Bhavsar
1
你的函数需要在其作用域内和外部都能够改变pChData吗?还是只需要在其作用域内改变?从你的问题中无法确定。如果你只需要在作用域内将值设置为可变变量,请小心不要使用inout。 - Eric Aya
@HarshalBhavsar memcpy()是在Darwin.C.string中定义的一个函数。它的其中一个用途是修改MTLBuffer。 - Andreas detests censorship
2个回答

8

默认情况下,传递给函数的参数在函数内部是不可变的。

您需要创建一个变量副本(与Swift 3兼容):

func receivedData(pChData: UInt8, andLength len: CInt) {
    var pChData = pChData
    var receivedData: Byte = Byte()
    var receivedDataLength: CInt = 0

    memcpy(&receivedData, &pChData, Int(len));  // Getting the error here
    receivedDataLength = len
    AudioHandler.sharedInstance.receiverAudio(&receivedData, WithLen: receivedDataLength)
}

或者,使用Swift 2,您可以在参数中添加var

func receivedData(var pChData: UInt8, andLength len: CInt) {
    var receivedData: Byte = Byte()
    var receivedDataLength: CInt = 0

    memcpy(&receivedData, &pChData, Int(len));  // Getting the error here
    receivedDataLength = len
    AudioHandler.sharedInstance.receiverAudio(&receivedData, WithLen: receivedDataLength)
}

第三种选择,但这不是你所要求的:将参数设置为inout。但它也会在func之外改变pchData,所以看起来你不想在这里使用这个选项-这不在你的问题中(当然我可能读错了)。

6
您正在尝试访问/修改“pChData”参数,除非您将其声明为“inout”参数,否则无法执行。有关“inout”参数的更多信息,请在此处学习。请使用以下代码进行尝试。
func receivedData(inout pChData: UInt8, andLength len: CInt) {
    var receivedData: Byte = Byte()
    var receivedDataLength: CInt = 0

    memcpy(&receivedData, &pChData, Int(len));
    receivedDataLength = len
    AudioHandler.sharedInstance.receiverAudio(&receivedData, WithLen: receivedDataLength)
}

1
在Swift4中,pChData应该声明为'pChData:inout UInt8'。 - ooOlly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接