在Swift中将字符加/减为Int

我需要实现一个算法,通过计算一个字符串的模来检查输入是否有效。

Kotlin中的代码:

private val facteurs = arrayOf(7, 3, 1) private fun modulo(s: String): Int { var result = 0 var i = -1 var idx = 0 for (c in s.toUpperCase()) { val value:Int if (c == '<') { value = 0 } else if (c in "0123456789") { value = c - '0' } else if (c in "ABCDEFGHIJKLMNOPQRSTUVWXYZ") { value = c.toInt() - 55 } else { throw IllegalArgumentException("Unexpected character: $c at position $idx") } i += 1 result += value * facteurs[i % 3] idx += 1 } return result % 10 } 

这意味着要对角色进行数学运算。

在Swift 3和4中有没有这样的优雅方法?

我尝试了一些这样的麻烦的构造:

 value = Int(c.unicodeScalars) - Int("0".first!.unicodeScalars) 

但它甚至没有编译。 我目前正在用XCode9使用Swift 4,但Swift3的答案也是受欢迎的。

您可以枚举字符串的unicodeScalars视图以及运行索引,使用开关/大小写模式匹配,并访问unicode标量的数值.value

 func modulo(_ s: String) -> Int? { let facteurs = [7, 3, 1] var result = 0 for (idx, uc) in s.uppercased().unicodeScalars.enumerated() { let value: UInt32 switch uc { case "<": value = 0 case "0"..."9": value = uc.value - UnicodeScalar("0").value case "A"..."Z": value = uc.value - UnicodeScalar("A").value + 10 default: return nil } result += Int(value) * facteurs[idx % facteurs.count] } return result % 10 } 

这与Swift 3和4编译。当然,你也可以throw一个错误,而不是返回无效的输入无效。

请注意,switch语句中的"<""0""9"等从上下文推断为UnicodeScalar ,而不是StringCharacter ,因此"0"..."9" (在此上下文中)是ClosedRangeuc可以匹配该范围。

像这样的东西适合我:

 "A".utf16.first! + 2 //comes out to 67 

小心强行打开“!”

如果你需要标量值你可以做

 "A".unicodeScalars.first!.value + 2 

在SPL中,可以在这里做更多的阅读。

对于c字符types值,你可以这样做:

 String(c).unicodeScalars.first!.value + 2 

这是一个尝试修改function:

 func modulo(s: String) -> Int? { var result = 0 var factors = [7,3,1] for (i, c) in s.uppercased().characters.enumerated() { let char = String(c) var val: Int if char == "<" { val = 0 } else if "0123456789".contains(char) { val = Int(char.unicodeScalars.first!.value - "0".unicodeScalars.first!.value) } else if "ABCDEFGHIJKLMNOPQRSTUVWXYZ".contains(char) { val = Int(char.unicodeScalars.first!.value - 55) } else { return nil } result += val * factors[(i) % 3] } return result % 10 } 

这是在迅速3 ...在4我相信你可以遍历字符串而不转换为字符