我有以下类型[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)是一个数字吧?
答案 0 :(得分:1)
来自文档:
类型转换是一种检查实例类型或处理的方法 该实例作为某个地方的不同超类或子类 在其自己的类层次结构中。 (......) 实际上,某个类类型的常量或变量 在幕后引用子类的实例。你在哪里 相信这是这种情况,你可以尝试向下转换为子类型 使用类型转换操作符(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
,然后你强迫Int
(Int
有一个接受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")
}