如何在Swift中将任何类型转换为整数

41

在声明 i 时,我遇到了一个错误。

var users =  Array<Dictionary<String,Any>>()
users.append(["Name":"user1","Age":20])
var i:Int = Int(users[0]["Age"])

如何获取整数值?

5个回答

44

var i = users[0]["Age"] as Int

var i = users[0]["Age"] as? Int

如GoZoner所指出,如果你不确定向下转换会成功,请使用上述代码。如果失败,则结果将为nil


注:该段代码涉及变量和数组下标访问,建议详细了解相关知识后再进行操作,以防止可能的错误发生。

1
有时它会返回nil。我使用了这种方法从“WKBridge”解析。 - Vyachaslav Gerchicov

27

Swift 4 的答案:

if let str = users[0]["Age"] as? String, let i = Int(str) {
  // do what you want with i
}

我遇到了一个问题,即解包看起来像Optional(3)的内容。我尝试将其转换为? Int,然后转换为? String - 两者都失败了。然后尝试解包并使用引发异常的类型,这揭示了Swift决定使用Int8来表示此值。所以,Int8不能转换为Int,Swift工程师们在思考。最终检查了if / else流中的所有int类型。 - Arnie Schwarzvogel

13
如果您确定结果是一个 Int,则使用:
var i = users[0]["Age"] as! Int

但如果你不确定并且希望在它不是Int时得到一个nil值,那么使用:

var i = users[0]["Age"] as? Int

当你不确定向下转型是否成功时,请使用类型转换运算符的可选形式(as?)。该运算符的这种形式将始终返回一个可选值,如果向下转型不可能,则该值将为nil。这使你能够检查向下转型是否成功。

2
值得注意的是,第一个示例中的“i”的类型为“Int”,但第二个示例中的“i”类型将是“Int?”。 - Ephemera
好的。我认为苹果可能会考虑使用as Intas Int?,而不是引入as? - GoZoner
这个观点很好。我想as?相当于-isKindOfClass:,但移动?可能更合理。 - Ephemera

2
这可能在之前起作用了,但对于Swift 3来说不是答案。只是为了澄清,我没有Swift 3的答案,下面是我使用上述答案进行测试,显然它不起作用。
我的数据来自NSDictionary。
print("subvalue[multi] = \(subvalue["multi"]!)")
print("as Int = \(subvalue["multi"]! as? Int)")
if let multiString = subvalue["multi"] as? String {
  print("as String = \(multiString)")
  print("as Int = \(Int(multiString)!)")
}

生成的输出为:

subvalue[multi] = 1
as Int = nil

我来翻译一下:

仅明确说明:
a)原始值的类型为Any?,值为:1
b)转换为Int会导致nil
c)转换为String会导致nil(打印行永远不会执行)

编辑
答案是使用NSNumber
let num = subvalue["multi"] as? NSNumber

然后我们可以将数字转换为整数
let myint = num.intValue


也许问题在于你使用了 NSDictionary 而不是 Dictionary?在 Swift 3 中,as? Int 应该可以正常工作。 - John Montgomery
1
其实,是的,那绝对是问题所在。NSDictionary 的值是 AnyObject,不能转换为 Int,因为它不是对象类型。使用 Swift 字典代替即可解决问题。 - John Montgomery

0
if let id = json["productID"] as? String {
   self.productID = Int32(id, radix: 10)!
}

这对我有用。 json["productID"]Any 类型。 如果可以转换为字符串,则将其转换为整数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接