我有一个函数从服务器获取一个文件并解析了该文件,我正在使用一个具有如下完成处理程序的函数来获取该文件
func getMachineDetails(completionHandler: @escaping ([MachineDetails]? , Error?) -> Void) {
var details = [MachineDetails]()
let url = URL(string: "https://somefile.txt")!
let task = URLSession.shared.downloadTask(with: url) { (urlOrnil, responseOrNil, errorOrNil) in
guard let fileURL = urlOrnil else { return }
do {
guard let contents = try? String(contentsOf: fileURL) else { throw errorOrNil! }
let lines = contents.split(separator: "\n")
for line in lines {
let entries = line.split(separator: ";").map { String($0) }
if entries.count == 4 {
let newMachine = MachineDetails(machineNumber:entries[0],
machineName:entries[1],
machineXML:entries[2],
machineWiFi:entries[3])
details.append(newMachine)
} else {
print("Malformed line \(line)")
}
}
} catch {
print("file error: \(error)")
}
}
task.resume()
print(details)
completionHandler(details, nil)
}
但是,当我尝试使用该函数时
func getMachineName(machineNumber: String) -> String {
getMachineDetails { (machineDetails, error) in
if let machineDetails = machineDetails {
let index = machineDetails.firstIndex { $0.machineNumber == machineNumber }
return machineDetails[index].machineName
}
}
}
我得到无法将类型“()”的返回表达式转换为返回类型“String”的错误。
知道我做错了什么吗?
返回闭包时,返回的不是getMachineName
函数,而是闭包本身。注意,闭包被定义为具有类型([MachineDetails]?,Error?)->void
,意思是一旦调用它,就不会在闭包中返回。通常,当您在函数中使用闭包,并且希望从该函数中获取值时,该函数也有闭包。您可以重新格式化该函数,如下所示:
func getMachineName(machineNumber: String, completion: @escaping (String) -> Void) {
getMachineDetails { (machineDetails, error) in
if let machineDetails = machineDetails {
let index = machineDetails.firstIndex { $0.machineNumber == machineNumber }
completion(machineDetails[index].machineName)
}
}
}
在for循环后直接添加completionhandler(详细信息,无)
for line in lines {
let entries = line.split(separator: ";").map { String($0) }
if entries.count == 4 {
let newMachine = MachineDetails(machineNumber:entries[0],
machineName:entries[1],
machineXML:entries[2],
machineWiFi:entries[3])
details.append(newMachine)
} else {
print("Malformed line \(line)")
}
}
completionHandler(details, nil)
我正在学习Java中的Lambda并试图理解它。例如,我有以下代码: 我不理解这个语句我看到是类型的引用变量。但是我不明白这个到底是什么。这是方法定义吗?这个方法的返回类型是什么?我认为应该是,因为方法的返回类型是。如有任何反馈将不胜感激。
为什么会发生异常'lambda表达式中的ad返回类型:AuthenticatedUser无法转换为User'?如果可选为空,我只想返回此AuthenticatedUser。
我需要通过触摸按钮来更改形状类型。我尝试了这种方法,但我得到了一个错误,即形状类型不能转换为布尔值。代码: 错误:
将异常获取为 :lambda表达式中的返回类型错误:
以下代码在IntelliJ和Eclipse中编译得很好,但JDK编译器1.8.0\u 25对此表示不满。首先,代码。 javac 1.8.0\u 25的输出为: 当我更换时?超级E只需使用E,JDK就能成功编译。 当我将替换为,JDK编译成功。 由于它适用于JDK 1.8.0_60,我怀疑它是编译器错误。 有没有详细说明是什么原因造成的以及何时修复的?
如果会发生重复,我需要确认数据。但不能这样做。 在这种情况下,是否可以将字符串转换为对象,或通过另一个表达式连接该数据? 我有一个问题: