【问题标题】:Error while trying to convert the Array to Int尝试将数组转换为 Int 时出错
【发布时间】:2018-07-02 01:34:49
【问题描述】:

所以我已经获取了我的捆绑版本并将其保存在一个数组中,但它是字符串类型的。我已经尝试将它映射为 Int 但我收到了Cannot invoke initializer for type 'Int' with an argument list of type''((String.Element))

let versionName = String(describing: Bundle.main.infoDictionary!["CFBundleShortVersionString"]!)  // 1.9.1

let versionNumeral = Array(versionName.westernArabicNumeralsOnly)   // ["1","9","1"]

 let convertedToInt = versionNumeral.map {Int($0)} // so i want it here to be [1, 9, 1] so  I can add them between them.

for element in convertedToInt {
    total += element
}

.westernArabicNumeralsOnly 是一个字符串扩展,它从版本中删除我的点,只让数字

extension String {
    var westernArabicNumeralsOnly: String {
        let pattern = UnicodeScalar("0")..."9"
        return String(unicodeScalars
            .flatMap { pattern ~= $0 ? Character($0) : nil })
    }
}

【问题讨论】:

  • 在不知道westernArabicNumeralsOnly 返回什么的情况下,我们如何为您提供帮助?
  • 如果你这样做let versionNumeral = ["1","9","1"],你的代码就可以工作。那么下一个问题是:westernArabicNumeralsOnly 存在吗?这似乎是个问题。
  • 我已经编辑了我的问题。该扩展名删除了点并返回“191”
  • 有什么特别的原因要写字符串扩展,因为你可以使用 versionName.components(separatedBy: ".") ,现在可以计算总数。

标签: ios arrays swift swift3


【解决方案1】:

无需westernArabicNumeralsOnly函数即可轻松获取号码

    let versionName = String(describing: Bundle.main.infoDictionary!["CFBundleShortVersionString"]!)  // 1.9.1
    let versionNumeral = Array(versionName.components(separatedBy: "."))   // ["1","9","1"]
    let convertedToInt = versionNumeral.map{Int($0)} // [1,9,1]
    var total = 0
    for element in convertedToInt {
        total = total + element!
    }
    print(total) // 11

【讨论】:

    【解决方案2】:

    字符和整数之间没有直接的转换。如果您想从字符串中提取版本号,以下可能是更好的方法。它还允许大于 9 的版本号

    let versionName = String(describing: Bundle.main.infoDictionary!["CFBundleShortVersionString"]!)  // 1.9.1
    let versionComponents = versionName.components(separatedBy: ".")
    let convertedToInt = versionComponents.map {Int($0)} 
    

    这个版本会输出一个 Int? 数组。如果你想要一个 Int 数组,那么你可以使用

    let convertedToInt = versionComponents.map {Int($0)!} 
    

    但您必须确保没有收到包含非数字字符的字符串。

    【讨论】:

    • 或使用.flatMap {Int($0)} 忽略非整数。
    【解决方案3】:

    我会用这个:

    let versionString = (Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String) ?? ""
    let versionInts = versionString.components(separatedBy: ".").map { Int($0) ?? 0 }
    

    【讨论】:

      猜你喜欢
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      相关资源
      最近更新 更多