从 Any 转换到其他任何东西都失败了

Posted

技术标签:

【中文标题】从 Any 转换到其他任何东西都失败了【英文标题】:Casting from Any to anything else fails 【发布时间】:2018-10-17 18:35:51 【问题描述】:

API 给了我一个类型为Any 的变量。打印出来是这样的。


  "sender" : "Kira",
  "created" : "08.05.2018",
  "text" : "Cncncm"

我尝试使用SwiftyJSONlet mydata = JSON(data) 那样投射它,但它失败了。我尝试使用 Swift 4 解码技术,但也失败了。我尝试这样做let myData = data as? Dictionary<String, String>,但又失败了。

我不知道在这里做什么。任何提示或解决方案?

【问题讨论】:

String吗?什么API?文件怎么说?您也许可以使用type(of:) 来确定变量的实际值 这太可怕了String。真是个面子。 ???? (不是笑你,而是和你在一起——去过那里) 【参考方案1】:

终于有机会展示Codable 协议中的隐藏宝石之一。请在 Playground 中运行以下命令:

import Cocoa

let jsonData = """
    
      "sender" : "Kira",
      "created" : "08.05.2018",
      "text" : "Cncncm"
    
    """.data(using: .utf8)!

struct SenderText: Codable 
    let sender: String
    let created: Date
    let text: String


let dayFormatter = DateFormatter()
dayFormatter.dateFormat = "dd.MM.yyyy"
let date = dayFormatter.date(from:"08.05.2018")
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(dayFormatter)

do 
    let sendText = try decoder.decode(SenderText.self, from: jsonData)
    print(sendText)
 catch 
    print(error)

定义如此复杂的解析器将一个凌乱的 JSON 字符串映射到您最喜欢的 struct 是多么容易,其纯粹的优雅几乎不会让我感到惊讶。不管你的日期格式看起来多么奇怪,在这个过程中它离被解析的距离几乎不超过 3 行。

关于强制转换,你应该注意一些事情:在 Swift 中,就像在大多数面向对象的语言中一样,只有当(且仅当)它已经 首先是别的东西(但这些知识已经在某个地方丢失了)。由于您的String“只是”一个String(可能伪装成Any),您将无法将其投射到其他任何东西。然而,Codable 协议为您提供了一种从Strings Datadecode 的极好方法,而且非常轻松。这个过程不应该被误认为是演员阵容,即使它看起来大致相同。它是从一个简单的 Data 中创建和初始化另一个结构更合适的对象,您很可能从您选择的普通 Web 服务中获得。

到目前为止很棒,至少在我的书中。

【讨论】:

【参考方案2】:

你可以像这样解析它,因为它是一个 json 字符串

let trd = yourVar as? String

if let data = trd?.data(using: String.Encoding.utf8) 

   do 
           var content = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:String]

           print(content)

       
      catch let error as NSError 

           print(error)
     

【讨论】:

如果结果类型应该是数组或字典,请停止建议.allowFragments。删除options 参数。并且投射到NSError 的桥是多余的。只需catch 就足够了。

以上是关于从 Any 转换到其他任何东西都失败了的主要内容,如果未能解决你的问题,请参考以下文章

从 '(NSNumber) -> NSNumber' 转换为不相关类型 '(Any) -> Any' 总是失败

Android - 从图像中裁剪文本(使用 openCV 或其他任何东西)

小5聊Chrome谷歌浏览器下载任何东西都提示 - 失败 - 下载错误的解决方法

无法找出MySQL Server安装失败的原因

将包转换为 perl6

AsynchronousJiraRestClientFactory 无法转换为 JiraRestClientFactory