在Swift 2.0中将字符转换为整数

30

我只是想将一个字符转换为一个整数

这应该很简单。但是我没有找到之前的答案有用。总会出现一些错误。也许是因为我在尝试Swift 2.0。

for i in (unsolved.characters) {
  fileLines += String(i).toInt()
  print(i)
}

我投票关闭此问题,因为该问题涉及到一个旧版本且不受支持的Swift编译器。 - Blazej SLEBODA
5个回答

47

在Swift 2.0中,toInt()等方法已被替换为初始化器(例如:Int(someString))。由于并非所有的字符串都能转换成整数,因此该初始化器是可失败的,这意味着它返回一个可选整数(Int?),而不是一个整数(Int)。最好的做法是使用if let解包这个可选值。

我不确定你的具体意图是什么,但是这段代码在Swift 2中可以运行,并且完成了我认为你要做的事情:

let unsolved = "123abc"

var fileLines = [Int]()

for i in unsolved.characters {
    let someString = String(i)
    if let someInt = Int(someString) {
        fileLines += [someInt]
    }
    print(i)
}

或者,对于一种更加迅速的解决方案:

let unsolved = "123abc"

let fileLines = unsolved.characters.filter({ Int(String($0)) != nil }).map({ Int(String($0))! })

// fileLines = [1, 2, 3]
您可以使用flatMap进一步缩短代码:
let fileLines = unsolved.characters.flatMap { Int(String($0)) }

flatMap 返回"一个 Array,该数组包含将 transform 映射到 self 上的非空结果"... 所以当 Int(String($0))nil 时,结果会被丢弃。


非常感谢!一切都正常工作,除了fileLines对我来说是一个Ints数组。var fileLines:[Int] = [](它说fileLines不能使用+=)。 - Aaron
1
你可以使用append方法,或者执行fileLines += [someInt] - Aaron Brager

9

这是我想到的一种即兴技巧。由于将Character转换为Int可能会有些棘手,但您可以轻松地将String转换为Int,因此可以这样做:

fileLines = Int(String(i))!

当然,这并不是非常优化,但对于你的情况来说,它可以解决问题。

3

Swift 4解决方案

将一个Character转换为String的方法:

let digit = Int(String("1"))! 
//Don't force unwrap this if you're not 100% sure your character is a digit

解决OP的问题的解决方案:
let fileLines = unsolved.compactMap{ Int(String($0) }
// fileLines = [1, 2, 3]

3
在最新的Swift版本中(至少是Swift 5),您不需要进行额外的转换即可将Character转换为StringCharacter具有属性wholeNumberValue,它尝试将字符转换为Int,如果该字符不能表示整数,则返回nil
let char: Character = "5"
if let intValue = char.wholeNumberValue {
    print("Value is \(intValue)")
} else {
    print("Not an integer")
}

3
实际上,将字符串转换为整数的更简单的方法是在Swift 2.0中进行以下操作:
let chars = Int(chars)

不确定这是否是您想要的...但您当然可以轻松将其应用于您的循环。


这似乎要容易得多。 - JMStudios.jrichardson
7
chars 不能既作为新创建常量的名称,又作为 Int 函数的参数。 - Luca Angeletti

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