gpt4 book ai didi

ios - 接受数组的 Swift 函数给出错误 : '@lvalue $T24' is not identical to 'CGFloat'

转载 作者:搜寻专家 更新时间:2023-11-01 05:46:47 27 4
gpt4 key购买 nike

所以我正在编写一个低通加速度计函数来缓和加速度计的抖动。我有一个 CGFloat 数组来表示数据,我想用这个函数抑制它:

// Damps the gittery motion with a lowpass filter.
func lowPass(vector:[CGFloat]) -> [CGFloat]
{
let blend:CGFloat = 0.2

// Smoothens out the data input.
vector[0] = vector[0] * blend + lastVector[0] * (1 - blend)
vector[1] = vector[1] * blend + lastVector[1] * (1 - blend)
vector[2] = vector[2] * blend + lastVector[2] * (1 - blend)

// Sets the last vector to be the current one.
lastVector = vector

// Returns the lowpass vector.
return vector
}

在这种情况下,lastVector 在我的程序顶部定义如下:

var lastVector:[CGFloat] = [0.0, 0.0, 0.0]

vector[a] = ... 形式的三行给出了错误。关于为什么我会收到此错误的任何想法?

最佳答案

如果您使用 inout 修饰符传递数组,该代码似乎可以编译:

func lowPass(inout vector:[CGFloat]) -> [CGFloat] {
...
}

我不确定这是否是一个错误。本能地,如果我将一个数组传递给一个函数,我希望能够修改它。如果我使用 inout 修饰符传递,我希望能够使原始变量指向一个新数组——类似于 C 中的 & 修饰符和 C++。

也许背后的原因是在 Swift 中有可变和不可变数组(和字典)。没有 inout 它被认为是不可变的,因此它不能被修改的原因。

附录 1 - 这不是错误

@newacct 说这是预期的行为。经过一番研究,我同意他的看法。但即使不是错误,我最初也认为它是错误的(读到最后得出结论)。

如果我有这样的类(class):

class WithProp {
var x : Int = 1

func SetX(newVal : Int) {
self.x = newVal
}
}

我可以将那个类的一个实例传递给一个函数,而这个函数可以修改它的内部状态

var a = WithProp()

func Do1(p : WithProp) {
p.x = 5 // This works
p.SetX(10) // This works too
}

无需将实例作为 inout 传递。我可以使用 inout 来使 a 变量指向另一个实例:

func Do2(inout p : WithProp) {
p = WithProp()
}

Do2(&a)

使用该代码,在 Do2 中,我将 p 参数(即 a 变量)指向新创建的 实例code>WithProp.

同样的事情不能用数组来完成(我假设字典也是如此)。要更改其内部状态(修改、添加或删除元素),必须使用 inout 修饰符。这是违反直觉的。

但阅读后一切都变得清晰了 this excerpt来自 swift 书:

Swift’s String, Array, and Dictionary types are implemented as structures. This means that strings, arrays, and dictionaries are copied when they are assigned to a new constant or variable, or when they are passed to a function or method.

因此,当传递给 func 时,它不是原始数组,而是它的副本 - 因此对其所做的任何更改(即使可能)都不会在原始数组上完成。

所以,最后,我上面的原始答案是正确的,并且遇到的行为不是错误

非常感谢@newacct :)

关于ios - 接受数组的 Swift 函数给出错误 : '@lvalue $T24' is not identical to 'CGFloat' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24707245/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com