将字符串数组转换为整数数组Swift 2?

24

[Xcode 7.1, iOS 9.1]

我有一个数组:var array: [String] = ["11", "43", "26", "11", "45", "40"]

我想将它(每个索引)转换为整数,以便我可以用它来倒计时计时器,针对索引。

如何在Swift 2中将String数组转换为Int数组?

我尝试了几个链接,但都没有成功,并且它们都给了我一个错误。 大多数链接的代码已过时或尚未更新到Swift 2,例如 toInt() 方法。

5个回答

74
使用map函数。
let array = ["11", "43", "26", "11", "45", "40"]
let intArray = array.map { Int($0)!} // [11, 43, 26, 11, 45, 40]

在像 UIViewController 这样的类中使用

let array = ["11", "43", "26", "11", "45", "40"]
var intArray = Array<Int>!

override func viewDidLoad() {
  super.viewDidLoad()
  intArray = array.map { Int($0)!} // [11, 43, 26, 11, 45, 40]
}

如果数组包含不同类型的元素,您可以使用flatMap(Swift 2)或compactMap(Swift 4.1+)仅考虑可以转换为Int的元素。

let array = ["11", "43", "26", "Foo", "11", "45", "40"]
let intArray = array.compactMap { Int($0) } // [11, 43, 26, 11, 45, 40]

4
使用map函数是可以的,但您不应该推荐强制解包。使用array.map{ Int($0) ?? 0 }会更好(更安全)。 - Leo Dabus
1
你说得没错,但问题中给出的数组无疑是可转换数字的数组。开发人员需要自行处理类型,是否需要进行可选测试取决于开发者。 - vadian
抱歉让您久等了!我的TableViewController出现了一个错误,提示我无法将我的数组转换为“TableViewController”类型。TableViewController类有例外吗?@vadian,“实例成员'array'无法在TableViewController类型上使用”。 - Lukesivi
你需要将映射数组的代码行放在一个函数内,例如viewDidLoad()。在类级别声明变量时,使用隐式解包可选类型。 - vadian
谢谢。这个方法适用于对象已经在数组中的情况,因此回答了我的问题。我的问题是我从Parse查询数据,然后想将String值转换为Int。有什么建议吗?无论如何感谢您的时间! - Lukesivi
你可以使用该行代码在任何地方映射数组,例如在从Parse检索数据后。 - vadian

10

Swift 4, 5:

使用带有Int强制转换的compactMap,无需使用'!'即可解决问题。

'compactMap'过滤空值并应用转换。

let array = ["1","foo","0","bar","100"]
let arrayInt = array.compactMap { Int($0) }

print(arrayInt)
// [1, 0, 100]

4

Swift 4, 5:

如果你想将字符串数字转换为 int 类型的数组(在我经历过的某些特定情况下),一种快速的方法是:

let pinString = "123456"
let pin = pinString.map { Int(String($0))! }

您的问题是:

let pinArrayString = ["1","2","3","4","5","6"]
let pinArrayInt = pinArrayString.map { Int($0)! }

你避免了从字符串数组转换为整数数组的不必要的转换(原本是从字符串转换而来)。 - Leena

1
我建议采用略微不同的方法。
let stringarr = ["1","foo","0","bar","100"]
let res = stringarr.map{ Int($0) }.enumerate().flatMap { (i,j) -> (Int,String,Int)? in
    guard let value = j else {
        return nil
    }
    return (i, stringarr[i],value)
}
// now i have an access to (index in orig [String], String, Int) without any optionals and / or default values
print(res)
// [(0, "1", 1), (2, "0", 0), (4, "100", 100)]

0

一个稍微不同的例子

let digitNames = [0: "Zero", 1: "One", 2:"Two", 3: "Three",
                  4:"Four",5:"Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine", 10:"Ten"

]

let numbers = [16,58,510]
let strings = numbers.map { (number) -> String in
    var number = number
    var output = ""
    repeat {
        output = digitNames[number % 10]! + output
        number /= 10
        
    } while number > 0
            return (output)
}

print(strings)


// strings is inferred to be of type [String]

// its value is ["OneSix", "FiveEight", "FiveOneZero"]

目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

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