【发布时间】:2021-03-09 15:42:16
【问题描述】:
在这两个代码之间
(返回 -> 无效)
static func dropboxWorkoutList ( userCompletionHandler: @escaping ([String]) -> Void) {
let client = DropboxClientsManager.authorizedClient
var files: [String] = []
_ = client?.files.listFolder(path: "/workouts")
.response { response, error in
if let result = response {
for entry in result.entries {
if let file = entry as? Files.FileMetadata {
let ext = (file.name as NSString).pathExtension
switch ext {
case "txt", "mrc", "zwo":
// print("filename:\(file.name) ext:\(ext) path:\(file.pathLower)")
files.append(file.pathLower!)
default:
continue
}
}
}
files = files.sorted(by: { $0 < $1 } )
// print("Contents of Workout Folder:\(files)")
userCompletionHandler(files)
} else if let error = error {
print(error)
}
}
}
调用它
dropboxFunc.dropboxWorkoutList() { (value) in
print("value:\(value)")
print("value[0] : \(value[0])")
print("value.count : \(value.count)")
}
结果:
value:["/1-01.txt", "/1-17.txt"]
value[0] : /1-01.txt
value.count : 5
但是当改变它时
- 来自
Return -> Void - 到
Return -> Any
尝试执行以下操作会迅速告诉我:
“预期返回‘Any’的闭包中缺少返回”
dropboxFunc.dropboxWorkoutList() { (value) in
print("value:\(value)")
print("value[0] : \(value[0])")
print("value.count : \(value.count)")
}
我只能允许执行 1 个打印语句。只是想了解其中的区别。
注意:问这个 Return list of files from function call
并作为可能的答案给出了这个 How I can return value from async block in swift
【问题讨论】:
-
你需要做
return value,或者价值或“随便”是Any。只是因为你可以有隐式return,当你写一行时,它会尝试将其转换为隐式返回。更多关于隐式返回github.com/apple/swift-evolution/blob/master/proposals/… 现在的问题是:你真的想返回Any吗?你要返回哪个值,你真的会用吗?还是只是测试? -
@Larme 我正在关注 SO stackoverflow.com/questions/52287840/…,这两个都是解决方案。
-
@Rob 我实际上想使用 dropboxWorkoutList 的返回值来填充我尚未编码的表格视图
-
@Rob 看起来确实合乎逻辑,但似乎与实际用途不符(如果您看到来自
static func dropboxWorkoutList() -> [String]的最初问题)。用户想要管理正确的异步调用,你不能直接返回,你需要有一个闭包并了解异步是如何工作的。在其中,获得列表后,刷新 UI。 -
您确实需要正确学习如何使用闭包/异步调用。您偶然发现任何教程都可以回答的简单问题