失败从Any转换为Int

时间:2018-02-05 20:50:25

标签: swift

我有以下类型[String: Any]的字典(这是日志的样子):

["name": Cesare de Cal, "last_name": de Cal, "email": hi@cesare.io, "id": 1012058902268810, "first_name": Cesare]

我想获取个人资料ID" id":

if let fbID = fbValues["id"] as? Int {
    print("here should be the fb Id", fbID)
} else {
    print("cast failed") // cast failed
}

但这次演员失败了。为什么?我假设" id" (1012058902268810)是一个数字吧?

2 个答案:

答案 0 :(得分:1)

抢已经为您提供了可能的解决方案。只是为了回答关于为什么转换失败的问题,它失败了,因为Swift中的类型转换是如何工作的:

来自文档:

  

类型转换是一种检查实例类型或处理的方法   该实例作为某个地方的不同超类或子类   在其自己的类层次结构中。 (......)   实际上,某个类类型的常量或变量   在幕后引用子类的实例。你在哪里   相信这是这种情况,你可以尝试向下转换为子类型   使用类型转换操作符(as?或as!)。 (......)   转换实际上不会修改实例或更改其值。基础实例保持不变;它被简单地处理和访问,作为它的类型的实例。

这将有效:

let something: Any = 1
let number = something as! Int

这不会起作用:

let something: Any = "1"
let number = something as! Int

这不会起作用,因为Int没有Any类型的初始化器:

let something: Any = "1"
let number = Int(something)

但是这会有效 - 首先你转向String,然后你强迫IntInt有一个接受String的初始值设定项

let something: Any = "1"
let string = something as! String
let number = Int(string)!

编辑以回答切萨雷:你是对的。我编辑了我的答案,只提供有关类型转换的更多信息,因为您已经解决了问题;)

这些只是获得演员/强制点的一些例子。在一个真实的场景中,你不应该像John Montgomery所指出的那样强迫解开任何一个。

答案 1 :(得分:1)

如果您不知道id值是String还是Int,您可以尝试同时处理这两项:

switch fbValues["id"] {
case nil:
    print("no id given")
case let string as String:
    if let id = Int(string) { print("id = \(id)") }
    else { print("non-numeric id \(string)") }
case let id as Int:
    print("id = \(id)")
default:
    print("what is this I don't even")
}