- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以我正在编写一个低通加速度计函数来缓和加速度计的抖动。我有一个 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/
这个问题在这里已经有了答案: The "++" and "--" operators have been deprecated Xcode 7.3 (12 个答案) 关闭 5 年前。 我刚刚将我的应
在下面的代码片段中,为什么行 o.margin() = m; 编译没有错误?它很容易得到警告,因为它几乎总是一个错误。我实际上会认为这是一个错误,因为它会将 R 值放在赋值的左侧。 #include
我是 C 语言的新手。我对左值错误有疑问。据我所知,当没有永久地址承载变量来存储右值时,我们会得到一个左值错误。在这里,我可以在左侧看到一个变量。但是,我仍然得到左值错误。有人可以澄清我对左值或所用运
#include int main(){ int i=0,j=1; printf("%d",++(i+j)); return 0; } 在这段代码中,我使用了增量运算符,但我不
#include int main() { int ary[2][3]; foo(ary); } void foo(int (*ary)[3]) { int i = 10,
这个问题已经有答案了: Error: lvalue required in this simple C code? (Ternary with assignment?) (4 个回答) lvalue
我无法理解这段代码为何有效。我进入 C# 世界已经有一段时间了,想在深入研究 C++11 中的新内容(如 RValue Refs 和移动语义)之前先复习一下 C/C++。 我想知道为什么我编写的这段代
我想使用以下我认为不标准的成语。我有利用返回值优化返回 vector 的函数: vector some_func() { ... return vector( /* something
谁能帮我弄清楚为什么我在最内层的循环程序中总是出错 * 突出显示它必须是一个可修改的 lValue。 using namespace std; #include int main() { /
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
有很多关于模板参数推导的讨论和澄清,特别是引用折叠和“通用引用”。本题通过相关细节:How does auto deduce type? ,而 Scott Meyers 的这篇论文更详细,可能会提供更
在下面的代码中: _imageView.hasHorizontalScroller = YES; _imageView.hasVerticalScroller = YES; _imageView.au
我有以下 C++ 代码,当我编译它时出现“需要左值”错误。请指出我哪里出错了。谢谢。 #include #include void main() { clrscr(); char r[5]
所以 Move 语义很棒,给了我们更高的性能。 我读到这是一个全新的特性,如果没有 C++11,这是“不可能”做到的。 但是我们可以在 C++11 之前做到这一点吗?就像下面这样。 class AAA
根据我的理解,在下面代码中标记为“第 2 行”的行中,表达式 (*ptr)++ 应该生成“需要左值”错误,因为 *ptr 的计算结果为 i=1 的常量值,这不是左值? 那么为什么程序能成功运行呢?还是
多年来,我一直在使用包含以下条件的代码 ref \$_[0] eq 'SCALAR' 我一直希望有一个 ARRAY 或 SCALAR,但最近我将 substr() 传递给了那个参数。意想不到的事情发生
好的,代码是: vector> imageFiltered; // some processing codes here parallel_for( blocked_range(0, imageFil
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
#include main() { int x,n,r; scanf("%d" , & x); for (n=2;n<(x/2);n++) { (x%n=r);
这个问题已经有答案了: Assignment statement used in conditional operators (6 个回答) 已关闭 5 年前。 #include int main()
我是一名优秀的程序员,十分优秀!