繁体   English   中英

“从抛出 function 到非抛出函数的无效转换”,试图存储一个闭包,它不能抛出

“Invalid conversion from throwing function to non-throwing function”, trying to store a closure and it can't throw

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在 Swift 中创建了一个 static 站点生成器,并提出了 API 用于添加“阅读器”——它负责将原始文件转换为它们支持的页面扩展名。

import Files

public struct Reader {
  var supportedExtensions: [String]
  var convert: (File) -> Page
}

public extension Reader {
  static func markdownReader() throws -> Self {
    Reader(supportedExtensions: ["md", "markdown"], convert: { file in
      let contents = try file.readAsString(encodedAs: .utf8)
      return Page(slug: "", title: "", content: contents, html: "")
    })
  }
}

这里的问题是我得到错误Invalid conversion from throwing function of type '(File) throws -> Page' to non-throwing function type '(File) -> Page' ,这是有道理的; nowhere in var convert: (File) -> Page它说它可以抛出,但真正的问题是,我也不能添加它? 那么,如何使用抛出闭包并将这些闭包存储为属性? 或者我可以简单地不在闭包中抛出任何错误吗?

1 个回复

你的throws在错误的地方:

static func markdownReader() throws -> Self {

markdownReader()不能抛出。 它只是返回一个阅读器。 抛出,如果有的话,将发生在闭包内的try file.readAsString中。 throw 不会神奇地从闭包定义中过滤到定义它的地方!

所以基本上你有两个选择。 一种是声明闭包类型实际上可以抛出:

var convert: (File) throws -> Page

另一个是:不要让扔掉的东西从封闭处渗出。 抓住它:

do {
    let contents = try file.readAsString(encodedAs: .utf8)
    return Page(slug: "", title: "", content: contents, html: "")
} catch {
    // ???
}

那么问题是在catch块中你仍然有义务返回一个 Page (除非你想在这一点上发生fatalError ,因为文件无法读取,所以我们可能会死)。 因此,您必须使用虚假content组成一个页面,因为您无法从文件中获取内容。

1 Swift 2:从抛出函数到非投掷函数的转换无效

我有一些(丑陋的)自编代码移植到Swift2并在lambda函数中得到此错误消息: 我不明白的是,我使用错误抛出函数JSONObjectWithData处理整个代码并捕获错误。 我在代码中什么也没扔。 然而编译器意味着我抛出一个错误。 我需要了解这种行为。 请善待,因为我知道 ...

6 错误迁移到Swift 2:从类型的抛出函数到非抛出函数类型的转换无效以及使用了未声明的类型

我正在尝试使用Swift 2语法来尝试...做...捕获错误处理,但是在尝试修改我的代码后,我遇到了一些我无法弄清的错误。 在此先感谢您的帮助。 在dispatch_async行上,错误:从类型为(()的throwing函数的无效转换将throws->()'转换为非抛出函数类型为' ...

9 Swift4从'(_,_,_)throws - >()'类型的抛出函数到非投掷函数类型的转换无效(数据?,URLResponse?,错误?)

因此,目的是解码HTTP响应responseString以便将信息保存到User的属性中,但是在插入代码行以便解码HTTP响应( myStruct )后,我不断弹出相同的错误。 我觉得它与Do Try Catch错误处理有关,但无法解决这个问题。 在此先感谢您的帮助 :) ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM