【问题标题】:Swift 2.0 how to convert string array to integer array [duplicate]Swift 2.0如何将字符串数组转换为整数数组[重复]
【发布时间】:2016-01-12 15:48:50
【问题描述】:

我有一个String 数组:

values = [textField1.text!, textField2.text!, textField3.text!, textField4.text!, textField5.text!]

我想将其转换为 Int 数组。我如何在 swift 2.0 中做到这一点?

【问题讨论】:

  • 如果文本字段不包含有效的整数表示怎么办?
  • @SergiiZhevzhyk 请注意:副本中接受的答案(我同意,它非常接近副本)还提供了一个使用强制展开的不安全版本,就像下面的 flashspys 原始答案一样。如果链接的帖子可以使用安全的方法更新其答案,最好的办法自然是,但在此之前,我建议不要将此帖子作为重复而关闭。
  • @dfri 已接受答案的第一条评论已经这样做了
  • @LeoDabus 我看到你的评论,但知道人们有时如何在 SO 上使用答案,很容易错过。我认为如果要将答案标记为涉及同一主题的问题的副本,则答案本身应该更新以确保安全。请注意,在这种情况下,该线程中的答案很可能会破坏许多“快速新手”代码。 vidian 明确指出“但问题中的给定数组无疑是一个可转换数字的数组”,所以我想说链接的答案太窄而不能成为答案到这个。因此:vidians 回答已编辑,或者这不是重复的。
  • (一般来说,一个好的答案应该是详尽无遗的,下面没有隐式使用 cmets)

标签: swift swift2


【解决方案1】:

您可以使用 Swift 地图功能:

var intArray = values.map({Int($0) ?? 0})

【讨论】:

  • 这假定所有文本字段都可以转换为整数。确实应该进行一些错误检查。无论如何 +1。
  • 确实如此。来自@dfri 的let myIntArrSafe = myStringArr.map { Int($0) ?? 0 } 是一个非常好的解决方案
  • 使用此解决方案,您无法确定无效数字与“0”之间的差异。最好返回一个[String?] 的数组并让调用者处理nil 值。即let probablyNumbers = myStringArray.map{ Int($0) }
【解决方案2】:

首先,您可能不应该使用强制解包可选字符串来初始化字符串数组(如果文本字段之一.text 属性是nil?运行时异常)。您可以使用 nil 合并运算符以安全的方式执行此操作:

let myStringArr = [textField1.text ?? "0", textField2.text  ?? "0"]

现在,类型转换也是如此:例如对于 attempted 转换 Int("foo") 字符串“foo”将返回 nil(不是,本身,转换,而是 StringInt 的初始化)。因此,假设您已经安全地到达了一个字符串数组(根据上面的代码示例),您可以再次使用 nil 合并运算符来确保 Int 数组中的 Int 条目的安全初始化:

let myStringArr = ["1", "foo", "4", "bar", "3.5"]

let myIntArrSafe = myStringArr.map { Int($0) ?? 0 }
print(myIntArrSafe)
/* [1, 0, 4, 0, 0] */

另一种解决方案是通过安全的整数转换扩展 String 类型,在 Int by String 初始化失败的情况下返回 0

extension String {
    var integerValue: Int { return Int(self) ?? 0 }
}

let myStringArr = ["1", "foo", "4", "bar", "3.5"]

let myIntArrSafe = myStringArr.map { $0.integerValue }
print(myIntArrSafe)
/* [1, 0, 4, 0, 0] */

【讨论】:

  • 您还可以使用flatMapInt 数组中取出任何nil 值。
  • @MrBeardsley 确实;然后,您将失去关于哪些文本字段产生 nil 条目以及哪些整数值与哪些文本字段相关联的任何引用(因为结果 Int 数组(给定 nils)被截断)
  • @dfri 是真的,如果结果是0,你也不知道为什么(它可能是“foo”字符串或“0”字符串的结果。所以,一切都取决于您的具体需求。因此,我更喜欢 [Int?]。我更喜欢 Int?(str: String) 等。
  • @user3441734 获取0 条目的好处是至少您知道哪些 字符串条目未能通过Int 初始化。使用flatMap,您会丢失此信息,因为结果数组被截断,并且您无法知道它是如何被截断的(因此:丢失对原始数组的元素到元素引用)
  • @dfri 我没有提到 flatMap ...我更喜欢 [Int?] 在这种情况下,我可以枚举和下一个 flatMap 到 [(index, integerValue)],其中 index 是原点的索引。 [字符串]
猜你喜欢
  • 2015-10-11
  • 2017-10-09
  • 2016-01-25
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多