当前位置: 首页 > 知识库问答 >
问题:

无法将“()”类型的返回表达式转换为swift[duplicate]中的返回类型“String”

江同化
2023-03-14

我有一个函数从服务器获取一个文件并解析了该文件,我正在使用一个具有如下完成处理程序的函数来获取该文件

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”的错误。

知道我做错了什么吗?

共有2个答案

卫骏
2023-03-14

返回闭包时,返回的不是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)
            }
        }
    }
陶和歌
2023-03-14

在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,我怀疑它是编译器错误。 有没有详细说明是什么原因造成的以及何时修复的?

  • 如果会发生重复,我需要确认数据。但不能这样做。 在这种情况下,是否可以将字符串转换为对象,或通过另一个表达式连接该数据? 我有一个问题: