无法将“字符串”类型的值转换为预期的参数类型“数据”

Posted

技术标签:

【中文标题】无法将“字符串”类型的值转换为预期的参数类型“数据”【英文标题】:Cannot convert value of type 'String' to expected argument type 'Data' 【发布时间】:2020-02-26 19:51:40 【问题描述】:

我当然希望能得到一些帮助。我正在使用 Swift 5.1。 我正在尝试获取当前日期(date4)并将其格式化为三个字母的月份缩写。没问题,那部分工作正常。然后我定义了一个名为 (currentMonthDate) 的常量,它包含三个字母月份和字符串“MoonData”的连接。结果如下所示:“FebMoonData” - 到目前为止,所有工作都按设计进行。

我的 Json 是按月分开的。下面显示的是价值两个月的 Json 作为缩写示例。显然,我的模型旨在适应 Json 结构 - 不包括在内。现在的问题。如果您查看 JSONDecoder 代码行,您会注意到我正在尝试在解码器代码行中使用串联字符串“currentMonthDate”。我的想法是,随着每个新月份的到来,data4 将发生变化,而 currentMonthDate 将反映该变化,然后会找到反映该特定月份的 JSON 数据块。我收到的错误是: 为了清楚起见,如果我在解码器行中简单地键入 FebMoonData(Feb 的 Json 块的名称),它会按预期工作。也就是说,它找到名为 FebMoonData 的 Json 数组。谢谢!

// JSON

let FebMoonData = """
[

"time":"20 Feb 2020 00:00 UT"

]
""".data(using: .utf8)!

let MarMoonData = 
[

"time":"20 Feb 2020 00:00 UT"

]

""".data(using: .utf8)!

// End JSON


 let date4 = Date()
        let dateFormatterGet = DateFormatter()
        dateFormatterGet.dateFormat = "MMM"
        let currentMonthDate = dateFormatterGet.string(from: date4) + "MoonData"


        let moonphase = try! JSONDecoder().decode([MoonPhase].self, from: currentMonthDate)

【问题讨论】:

let MarMoonData = 之后的字符串文字的前导 """ 缺失。 显示您的MoonPhase 声明。顺便说一句,您的 currentMonthDate 它不是有效的 JSON 数组。请查看如何提供minimal reproducible example 【参考方案1】:

decodefrom参数必须是Data,而不是String,这是报错信息。无论如何,作为 JSON 数据的文字日期字符串毫无意义。无法在运行时组合变量名。

你能做的是

let month = Calendar.current.component(.month, from: Date())

let data : Data
switch month 
   case 1: data = Data(JanMoonData.utf8)
   case 2: data = Data(FebMoonData.utf8)
   // ...


let moonphase = try! JSONDecoder().decode([MoonPhase].self, from: data)

let month = Calendar.current.component(.month, from: Date())

let moonJSON : String
switch month 
   case 1: moonJSON = JanMoonData
   case 2: moonJSON = FebMoonData
   // ...


let moonphase = try! JSONDecoder().decode([MoonPhase].self, from: Data(moonJSON.utf8)

let moonJSONArray = [JanMoonData, FebMoonData, MarMoonData, ..., DecMoonData]
let month = Calendar.current.component(.month, from: Date())
let moonJSON = moonJSONArray[month - 1]
let moonphase = try! JSONDecoder().decode([MoonPhase].self, from: Data(moonJSON.utf8)

【讨论】:

我在一定程度上理解了您的回答,但仍然遇到问题。首先,由于 Json 结构已经被设计为“utf8”,我还需要 case 语句中的扩展名吗?此外,我收到一条错误消息:“在使用之前使用了常量‘数据’。”我假设 ... data = Data(FebMoonData) ... 将 JSON 值返回到 Data 类型的“data”变量中,对吗?因此,如果是这种情况,那么为什么会出现错误?谢谢 您会收到错误消息,因为 switch 并不详尽。最后一种情况不是case 12,而是写default: data = Data(DecMoonData.utf8),这可以修复错误。是的,您需要.utf8 进行转换。但是您也可以声明一个String 变量并在最后将其转换为Data。我只是想向您展示一种方式,有多种方式。 非常感谢您抽出宝贵时间提供帮助。我现在收到此错误:线程 1:致命错误:“尝试!”表达式意外引发错误: Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "格式错误字符 178102 周围的数组。" UserInfo=NSDebugDescription=字符 178102 周围的格式错误的数组。))) 有趣的是,如果我只是在解码器行中使用“FebMoonData”,它可以正常工作,但由于某种原因,它不喜欢从 moonJSNArray 或您提供的其他建议中获得的信息。 另外,当我尝试在 moonJSON 末尾使用 .utf8 时,我收到一条错误消息,指出“数据类型的值没有成员 .utf8”

以上是关于无法将“字符串”类型的值转换为预期的参数类型“数据”的主要内容,如果未能解决你的问题,请参考以下文章

无法将“字符串”类型的值转换为预期的参数类型“数据”

无法将“字符串”类型的值转换为预期的参数类型 [任何]

无法将“字符串”类型的值转换为预期的参数类型

无法将“字符串”类型的值转换为预期的参数类型“布尔”

无法将 uibutton 类型的值转换为预期的参数字符串

将录制的视频保存到照片库 - 无法将“URL”类型的值转换为预期的参数类型“字符串”