gpt4 book ai didi

swift - 在 Swift 中作为 Int 添加/减去字符

转载 作者:可可西里 更新时间:2023-11-01 00:40:11 25 4
gpt4 key购买 nike

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

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)

但它甚至无法编译。我目前正在将 Swift 4 与 XCode9 一起使用,但也欢迎使用 Swift3 答案。

最佳答案

您可以枚举unicodeScalars串在一起的 View 使用运行索引,使用 switch/case 模式匹配,并访问数字 .value unicode 标量的:

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错误而不是返回 nil对于无效输入。

请注意 "<" , "0" , "9"等等在 switch 语句中从上下文推断为 UnicodeScalar ,不像StringCharacter ,因此 "0"..."9" (在这种情况下)是 ClosedRange<UnicodeScalar>uc可以匹配那个范围。

关于swift - 在 Swift 中作为 Int 添加/减去字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45176254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com