如何在Swift中将字符串(数字)转换为整数数组

13
我想知道在Swift中如何将字符串转换为整数数组。在Java中,我经常这样做:
String myString = "123456789";
int[] myArray = new int[myString.lenght()];
for(int i=0;i<myArray.lenght;i++){
   myArray[i] = Integer.parseInt(myString.charAt(i));
}  

谢谢大家的帮助!


我正在删除java标签,因为这个问题实际上与Java无关。 - yshavit
8个回答

19

您可以使用flatMap将字符转换为字符串,并将字符字符串强制转换为整数:

Swift 2或3

let string = "123456789"
let digits = string.characters.flatMap{Int(String($0))}
print(digits)   // [1, 2, 3, 4, 5, 6, 7, 8, 9]"

Swift 4

let string = "123456789"
let digits = string.flatMap{Int(String($0))}
print(digits)   // [1, 2, 3, 4, 5, 6, 7, 8, 9]"

Swift 4.1

let digits = string.compactMap{Int(String($0))}

Swift 5 或更高版本

我们可以使用新的字符属性 wholeNumberValuehttps://developer.apple.com/documentation/swift/character/3127025-wholenumbervalue

let digits = string.compactMap{$0.wholeNumberValue}

Swift 5.2或更高版本 键路径表达式作为函数

let digits = string.compactMap(\.wholeNumberValue)

Swift 4.1弃用.flatMap用于此用例。请改用.compactMaplet digits = string.compactMap{Int(String($0))} - leanne
let digits = string.compactMap(\.wholeNumberValue) 这样写也是一种不错的方式(Swift 5) - JKvr
@JKvr 是的,它被称为 keyPath。https://dev59.com/_F0a5IYBdhLWcg3wW3nN#30415964 Swift 5.2 或更高版本可用。它不适用于 Swift 5.0。 - Leo Dabus

19
let str = "123456789"
let intArray = map(str) { String($0).toInt() ?? 0 }
  • map() 迭代 str 中的 Character
  • String($0)Character 转换为 String
  • .toInt()String 转换为 Int。 如果失败(??),则使用 0

如果您更喜欢使用 for 循环,请尝试:

let str = "123456789"
var intArray: [Int] = []

for chr in str {
    intArray.append(String(chr).toInt() ?? 0)
}

或者,如果您想迭代 String 的索引:

let str = "123456789"
var intArray: [Int] = []

for i in indices(str) {
    intArray.append(String(str[i]).toInt() ?? 0)
}

3
在Swift 2.x中,String类中不再提供toInt()方法。 - Luca Angeletti

2

Swift 3

将整型数组转换为字符串

let arjun = [1,32,45,5]
    print(self.get_numbers(array: arjun))

 func get_numbers(array:[Int]) -> String {
        let stringArray = array.flatMap { String(describing: $0) }
        return stringArray.joined(separator: ",")

字符串转整数数组

let arjun = "1,32,45,5"
    print(self.get_numbers(stringtext: arjun))

    func get_numbers(stringtext:String) -> [Int] {
    let StringRecordedArr = stringtext.components(separatedBy: ",")
    return StringRecordedArr.map { Int($0)!}   
}

1
@rintaro的回答是正确的,但我想补充一下,你可以使用reduce排除任何不能转换为Int的字符,并在发生这种情况时显示警告消息:
let str = "123456789"
let intArray = reduce(str, [Int]()) { (var array: [Int], char: Character) -> [Int] in
    if let i = String(char).toInt() {
        array.append(i)
    } else {
        println("Warning: could not convert character \(char) to an integer")
    }
    return array
}

优点是:
  • 如果intArray包含零,您将知道str中有一个0,而不是其他字符变成了零
  • 如果存在可能破坏事情的非Int字符,您将得到通知。

0
var myString = "123456789"
var myArray:[Int] = []

for index in 0..<countElements(myString) {
    var myChar = myString[advance(myString.startIndex, index)]
    myArray.append(String(myChar).toInt()!)
}

println(myArray)   // [1, 2, 3, 4, 5, 6, 7, 8, 9]"

要从 string 中获取指向 chariterator,您可以使用 advance

在 Swift 中将 string 转换为 int 的方法是 toInt()


2
你的循环中还有一个循环——像那样一遍又一遍地调用advance是个坏主意,因为这会让程序每次都从字符串开头开始步进。 - Nate Cook

0

Swift 3 更新:

@appzYourLife:没错,Swift 3 中 String 的 toInt() 方法已不再可用。作为替代方案,您可以这样做:

intArray.append(Int(String(chr)) ?? 0)

将其包含在Int()中可将其转换为整数。


0
let array = "0123456789".compactMap{ Int(String($0)) }
print(array)

2
请勿仅以代码形式回答问题,还需提供解释说明代码的作用及如何解决问题。带有解释说明的答案通常更有帮助、更高质量,并更有可能获得赞同。 - Mark Rotteveel

0

Swift 3: 函数式编程

  1. 使用components(separatedBy separator: String) -> [String]String拆分为单独的String实例。

参考:返回一个包含由给定分隔符分隔的字符串的子字符串的数组。

  1. 使用flatMapArray方法,在转换为Int时绕过nil合并。

参考:返回一个包含对该序列的每个元素调用给定转换的非空结果的数组。

实现

let string = "123456789"
let intArray = string.components(separatedBy: "").flatMap { Int($0) }

Swift 4.1弃用.flatMap用于此用例。请改用.compactMaplet intArray = string.components(separatedBy: "").compactMap{ Int($0) } - leanne
@leanne 这是错误的,它会导致一个只有一个元素且值与输入相同的数组 [123456789]。第一种方法 components(separatedBy: "") 会导致一个单独的字符串元素 ["123456789"] - Leo Dabus
我只是用新的.compactMap方法替换了被弃用的.flatMap方法,@LeoDabus。 两个结果相同。如在Xcode的调试控制台中打印的那样:[123456789][123456789]。请注意,我不会判断结果是否适合原始问题,而只是提醒任何来到这里的人,在试图实现删除“nil”值的结果时,.flatMap已被弃用,转而使用.compactMap - leanne

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