在Swift中将Character转换为Int

时间:2015-03-03 01:14:38

标签: ios swift int character checksum

我正在开展一个项目,其中包括使用Damm Algorithm验证Int输入的校验和。我设法创建了一个操作表,我访问表中值的方法包括传递一个临时值和一个数字作为列值传入。 离。

     self.tableToUse[interim,checkSumArray[i]]

不幸的是,当我试图将输入中的数字传递到get / set方法时,我遇到了麻烦,我找不到将字符转换为Int的方法。

    func encode(number: Int) -> Int{
    var checkSumArray = [Int]()
    if number > 99999999 {
        println("number is too large")
        return 0
    }
    else if number < 0 {
        println("invalid input")
        return 0
    }
    else {
        checkSumArray.append(number%(10))
        checkSumArray.append((number%(100)-checkSumArray[0])/10)
        checkSumArray.append((number%(1000)-checkSumArray[1])/100)
        checkSumArray.append((number%(10000)-checkSumArray[2])/1000)
        checkSumArray.append((number%(100000)-checkSumArray[3])/10000)
        checkSumArray.append((number%(1000000)-checkSumArray[4])/100000)
        checkSumArray.append((number%(10000000)-checkSumArray[5])/1000000)
        checkSumArray.append((number%(100000000)-checkSumArray[6])/10000000)
        checkSumArray = checkSumArray.reverse()

        var interim: Int = 0

        for i in 0..<checkSumArray.count{
            interim = self.tableToUse[interim,checkSumArray[i]]
        }
        return interim
    }
}

正如你所看到的,我不得不采取一种非常讨厌的方式处理这个问题。它有效,但它非常有限,效率低下,看起来或维护起来很难看。我已经看过在Damm Table中使用Characters而不是Ints的选项我已经构建并改变了get / set方法来处理那些,但是这需要很多额外的工作并且可以介绍其他问题。任何有关处理此问题的替代方法的建议,或将字符转换为Ints的方法都将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:2)

if let int = Int(String(Character("1"))) {
    print(int)
}

您还可以创建一个字符扩展名,如下所示:

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

测试

Character("1").integerValue  // 1
Character("2").integerValue  // 2
Character("3").integerValue  // 3
Character("4").integerValue  // 4
Character("5").integerValue  // 5
Character("6").integerValue  // 6
Character("7").integerValue  // 7
Character("8").integerValue  // 8
Character("9").integerValue  // 9
Character("0").integerValue  // 0
Character("a").integerValue  // nil

Array("9876").first!.integerValue  // 9
Array("9876")[1].integerValue      // 8
Array("9876")[2].integerValue      // 7
Array("9876").last!.integerValue   // 6

编辑/更新 Swift 5

Swift 5为Character添加了许多新属性,其中一个完全符合此目的。它被称为wholeNumberValue

Character("1").wholeNumberValue  // 1
Character("2").wholeNumberValue  // 2
Character("3").wholeNumberValue  // 3
Character("4").wholeNumberValue  // 4
Character("④").wholeNumberValue  // 4
Character("5").wholeNumberValue  // 5
Character("6").wholeNumberValue  // 6
Character("7").wholeNumberValue  // 7
Character("8").wholeNumberValue  // 8
Character("9").wholeNumberValue  // 9
Character("0").wholeNumberValue  // 0
Character("万").wholeNumberValue  // 10_000
Character("a").wholeNumberValue  // nil

答案 1 :(得分:2)

基于How convert a *positive* number into an array of digits in Swift,您可以这样做(数字必须为正数):

let checkSumArray = map(number.description) { String($0).toInt()! }

答案 2 :(得分:1)

不需要使用字符,但是您的代码可以创建 具有输入数字的十进制数字的数组可以大大增加 简化为:

var checkSumArray = [Int]()
var tmp = number
while tmp > 0 {
    checkSumArray.append(tmp % 10)
    tmp /= 10
}
checkSumArray = checkSumArray.reverse()