- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试插入带有 inout
参数的函数,将从异步回调接收到的数据附加到外部数组。然而,它不起作用。我尝试了我所知道的一切来找出原因 - 但没有成功。
根据@AirspeedVelocity的建议,我重写了代码,如下所示,以删除不必要的依赖项。我还使用 Int
作为 inout
参数以保持简单。
输出始终为:之前的c:0
c 之后:1
我无法弄清楚这里出了什么问题。
func getUsers() {
let u = ["bane", "LiweiZ", "rdtsc", "ssivark", "sparkzilla", "Wogef"]
var a = UserData()
a.userIds = u
a.dataProcessor()
}
struct UserData {
var userIds = [String]()
var counter = 0
mutating func dataProcessor() -> () {
println("counter: \(counter)")
for uId in userIds {
getOneUserApiData(uriBase + "user/" + uId + ".json", &counter)
}
}
}
func getOneUserApiData(path: String, inout c: Int) {
var req = NSURLRequest(URL: NSURL(string: path)!)
var config = NSURLSessionConfiguration.ephemeralSessionConfiguration()
var session = NSURLSession(configuration: config)
var task = session.dataTaskWithRequest(req) {
(data: NSData!, res: NSURLResponse!, err: NSError!) in
println("c before: \(c)")
c++
println("c after: \(c)")
println("thread on: \(NSThread.currentThread())")
}
task.resume()
}
谢谢。
最佳答案
遗憾的是,正在修改inout
async-callback 中的参数没有意义。
Parameters can provide default values to simplify function calls and can be passed as in-out parameters, which modify a passed variable once the function has completed its execution.
...
An in-out parameter has a value that is passed in to the function, is modified by the function, and is passed back out of the function to replace the original value.
从语义上讲,输入输出参数不是 "call-by-reference" ,但是"call-by-copy-restore" .
就您而言,counter
仅当 getOneUserApiData()
时才回写返回,不在 dataTaskWithRequest()
中回调。
这是您的代码中发生的情况
getOneUserApiData()
调用,值counter
0
复制到c
<子>1
c
<子>1
dataTaskWithRequest()
getOneUserApiData
返回,并且值 - 未修改 - c
1 回写到 counter
c
重复 1-4 过程<子>2
,c
<子>3
,c
4 ...c
1 递增。c
2 递增。c
3 递增。c
4 递增。结果counter
未修改:(
详细说明
通常,in-out
参数是通过引用传递的,但这只是编译器优化的结果。当闭包捕获inout
时参数,“按引用传递”不安全,因为编译器无法保证原始值的生命周期。例如,考虑以下代码:
func foo() -> () -> Void {
var i = 0
return bar(&i)
}
func bar(inout x:Int) -> () -> Void {
return {
x++
return
}
}
let closure = foo()
closure()
在此代码中,var i
当 foo()
时被释放返回。如果x
是对 i
的引用, x++
导致访问冲突。为了防止这种竞争情况,Swift 在这里采用了“call-by-copy-restore”策略。
关于swift - 异步回调中的 Inout 参数未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39862462/
这并不是要实际创建一个带有 inout 端口的 verilog 模块。我发现了很多关于这个的帖子。 我坚持的是,如果我有一个带有输入端口的黑盒模块,假设它的定义如下 module blackbox(i
我有两段代码 func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { /
我的 TableViewController 类中有这个奇怪的错误消息 class MenuTableViewController: UITableViewController { filepriva
这行 var machine = [CChar](_unsafeUninitializedCapacity: size, initializingWith: 0) 抛出错误。 错误信息: Cannot
我正在制作一个应用程序,当您按下一个表示紧急的按钮时,会有一个标签显示“紧急”。就在我实现与按钮的用户交互之前,我有一个数组(如下所示),其中一些对象具有 urgent = true,但有些对象具有
1、MySQL 存储过程参数(in) MySQL 存储过程 “in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改此参数,但对 in 类型参数的修改,
我知道 inout 参数是什么以及如何使用它们。假设我们有一个 inout 参数 io并希望创建一个双向静态 RAM,例如以下代码: LIBRARY ieee; USE ieee.std_logic_
我认为 inout 让你传入一个引用(准确吗?),然后如果引用被多次更改,就像你可能对数组所做的那样,那么数组就不必复制很多次,因为它现在是一个引用类型? 最佳答案 swift 中输入输出参数的语义不
如果为两个参数传递相同的变量会出错。谁能解释为什么我们不能在输入参数函数中传递相同的变量,而我们可以在普通函数中传递 func swapTwoInts(a: inout Int, b: inout I
我正在 Swift 中迈出第一步,并解决了第一个问题。我正在尝试在具有约束的通用函数上使用 inout 通过引用传递数组。 首先,我的申请起点: import Foundation let sort
我想用 T 变量简化这段代码,但无法编译成功。希望你能给我指路。 这是我要重写的“重复”代码: func getIntegerValue (listValues: [Any], numValu
我有三个类 A、B 和 C。A 有一个名为 rA 的资源。我想要实现的是所有这些实例都引用了完全相同的资源。 所以用 Swift 术语具体来说: A 类有一个名为 foo 的属性: private v
我有一个像下面这样的函数,但是当我执行它时,它显示“Escaping closure captures 'inout' parameter 'cani'”我错过了什么? func duration(o
在一个对象中,我有一个指向另一个特定类的某个对象的常量句柄数组。在一个方法中,我可能想将其中一个句柄作为 inout 返回。 -范围。这里作为一个简化的例子: class A {} class B {
我知道什么inout用于值类型。 对于对象或任何其他引用类型,在这种情况下该关键字是否有用途,而不是使用 var ? 代码示例: private class MyClass { private
标题可能有点令人困惑,所以让我向您解释一下。 在 Swift 中,我们可以拥有带有默认参数值的函数,例如: func foo(value: Int = 32) { } 我们也可以有 In-Out 参数
在书籍中搜索了一段时间后,在这里有关于stackoverflow的文章,也有关于一般网络的文章,我发现很难找到对fortran参数意图之间真正差异的简单解释。我了解的方式是这样的: intent(in
优良作法规定,Fortran中的子例程参数应各自具有指定的意图(即this question所述的intent(in),intent(out)或intent(inout)): subroutine b
拥有什么实际区别 subroutine fillName(person) type(PersonType), intent(inout) :: person person%name = "
我从 Chisel 3 源代码生成 Verilog,并使用 UCF 文件将 Verilog 的顶部模块端口映射到 FPGA 引脚。 我的设计中有一组输入输出引脚(SDRAM 数据引脚),它们在 Chi
我是一名优秀的程序员,十分优秀!