尝试将Array转换为Int时出错

时间:2018-01-23 09:27:57

标签: ios arrays swift swift3

所以我采用了我的捆绑版本并将其保存在一个数组中,但它的类型为String。我试过并将它映射为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 })
    }
}

3 个答案:

答案 0 :(得分:1)

角色和Ints之间没有直接转换。如果您想从字符串中提取版本号,以下可能是更好的方法。它还允许版本号大于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)!} 

但你必须确保没有发送带有非数字字符的字符串。

答案 1 :(得分:0)

我用这个:

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

答案 2 :(得分:0)

  

在没有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