gpt4 book ai didi

ios - 对于 Swift 中与闭包相关的代码,我该如何表达我的意思?

转载 作者:行者123 更新时间:2023-11-28 06:56:54 25 4
gpt4 key购买 nike

我首先通过的是一个 JavaScript 代码示例,它看起来应该可以工作,但仔细检查后会有不同的行为。我的 Swift 代码目前有 SwiftyJSON :

    for(var index = 0; index < datesToLoad.count; index += 1) {
var formattedDate = formatter.stringFromDate(datesToLoad[index]);
if (presentLocation["days"][formattedDate] == nil) {
loadDataFromURL(NSURL:"http://api.sunrise-sunset.org/json?formatted=0&lat=\(presentLocation.coordinate.latitude)&lon=\(presentLocation.coordinate.longitude)&date=\(formattedDate)&formatted=0", completion: {(data, error) -> Void in {
if (var json = JSON(data:data)) {
presentLocation["days"][formattedDate]["sunrise"] = parser(json["results"]["sunrise"]);
presentLocation["days"][formattedDate]["sunset"] = parser(json["results"]["sunset"]);
}
}
}
}

现在我希望代码不会按预期工作。我想要完成的是,对于列表的每个 formattedDate 值,都会进行异步调用以从 URL 检索数据,并且每个 API 调用都将使用 formattedDate 值,该值在调用了 loadDataFromURL()。我期望会发生的是循环将快速运行,产生一些异步请求,并且 formattedDate 将可以使用它定义的最后一个值。我可能不知道如何在 Swift 中正确执行此操作,因为从 API 返回的数据提供了多个时间戳,但我想知道通过 formattedDate 的多个值的首选方法回调函数在其 loadDataFromURL() 函数被调用时查看激活的版本。

我也可以通过完全展开(四元素)循环并为每个基于闭包的 API 调用使用单独的变量名来获得我想要的结果,但我真的更想知道什么是处理这个问题的正确方法类似的问题。

最佳答案

for 循环的每次传递都会创建一个新的 formattedDate 变量,该变量独立于在任何其他传递中创建的 formattedDate 变量。

因此您的循环应该按照您的预期进行。

Playground 演示:

import XCPlayground
import UIKit

var blocks: [()->Void] = []

for i in 0..<5 {
var s = "\(i)"
blocks.append( { print(s) } )
}

print("calling blocks")

for block in blocks {
block()
}

输出:

calling blocks
0
1
2
3
4

关于ios - 对于 Swift 中与闭包相关的代码,我该如何表达我的意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33268176/

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