Преобразование символов в Int в Swift
Я работаю над проектом, который включает проверку контрольной суммы ввода Int с Damm Algorithm. Мне удалось создать рабочую таблицу, и мой метод для доступа к значению в таблице включает в себя передачу промежуточного значения и цифры для передачи в качестве значения столбца.
напр.
self.tableToUse[interim,checkSumArray[i]]
К сожалению, я столкнулся с проблемой, когда пытаюсь передать цифры с моего ввода в метод get/set, где я не могу найти способ преобразования символов в Ints.
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, которую я создал и изменил метод get/set, чтобы справиться с ними вместо этого, но это много дополнительной работы и может привести к другим проблемам. Любые предложения об альтернативных способах обработки этого или способ преобразования символов в инты будут оценены.
Спасибо!
Ответы
Ответ 1
Нет необходимости работать с символами, но ваш код для создания
массив с десятичными цифрами входного номера может быть значительно
упрощается:
var checkSumArray = [Int]()
var tmp = number
while tmp > 0 {
checkSumArray.append(tmp % 10)
tmp /= 10
}
checkSumArray = checkSumArray.reverse()
Ответ 2
if let myInt = String(Character("1")).toInt() {
println(myInt)
}
Вы также можете создать расширение символа следующим образом:
extension Character {
var integerValue:Int {
return String(self).toInt() ?? 0
}
}
Тестирование
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 // 0
Array("9876").first!.integerValue // 9
Array("9876")[1].integerValue // 8
Array("9876")[2].integerValue // 7
Array("9876").last!.integerValue // 6
Ответ 3
На основе Как преобразовать * положительный * номер в массив цифр в Swift, вы можете сделать (номер должен быть положительным):
let checkSumArray = map(number.description) { String($0).toInt()! }