【问题标题】:Cannot convert value of type 'String?' to expected argument type 'URL'无法转换“字符串”类型的值?到预期的参数类型'URL'
【发布时间】:2016-11-01 13:07:03
【问题描述】:

我正在尝试从主包中的文件加载数据。当我使用此代码时

 let path = Bundle.main.path(forResource: "abc", ofType: "txt")
 let dataTwo = try! Data(contentsOf: path)\\ error here

我也尝试将字符串转换为 URL

 let dataTwo = try! Data(contentsOf: URL(string: "file://\(path)")!)

但执行后我得到了这个

致命错误:在展开可选值时意外发现 nil

【问题讨论】:

  • 您确定要加载的文件包含在您的捆绑包中吗?将它们放在项目文件夹中是不够的,您必须指示 Xcode 将它们实际复制到包中。
  • 我敢肯定它只是在那里。我还检查了构建阶段中的复制捆绑资源
  • 您可以签入生成的包以查看文件是否真的存在...

标签: ios swift3


【解决方案1】:

您可能想改用.url

let url = Bundle.main.url(forResource: "abc", withExtension:"txt")
let dataTwo = try! Data(contentsOf: url!)

并安全地处理错误而不是强制解包。

简单版:

if let url = Bundle.main.url(forResource: "abc", withExtension:"txt"),
    let dataTwo = try? Data(contentsOf: url) 
{
    // use dataTwo
} else {
    // some error happened
}

更好:

do {
    guard let url = Bundle.main.url(forResource: "abc", withExtension:"txt") else {
        return
    }
    let dataTwo = try Data(contentsOf: url)
    // use dataTwo
} catch {
    print(error)
}

这样您就不需要将路径转换为 ​​URL,因为您从一开始就使用 URL,并且可以处理错误。在您的具体情况下,您将知道您的资产是否存在以及您的 URL 是否正确。

【讨论】:

    【解决方案2】:

    对于文件 URL,使用 init(fileURLWithPath:) 构造函数。

    这里也有

    let dataTwo = try! Data(contentsOf: path)\\ error here
    

    摆脱try! 并使用适当的错误处理来查看真正发生的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-18
      • 2019-12-24
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      相关资源
      最近更新 更多