【问题标题】:Apply a number to each letter in text swift2对文本swift2中的每个字母应用一个数字
【发布时间】:2016-03-10 20:58:58
【问题描述】:

我想比较 UITextField 中的两个条目,为每个字母指定一个数字,然后比较两个字段中字母相加的结果。

例子:

a=1 b=2 c=3 d=4 e=5 f=6

textfield1= cae
textfield2= fca

结果是:

textfield1=9 和
textfield2=10

【问题讨论】:

标签: numbers swift2 textfield


【解决方案1】:

您可以使用每个字符的 unicode 标量表示(查找 ASCII 表)并将这些移位的 -96 相加(例如 a -> 1b -> 2 等等)。在下文中,大写字母将生成与小写字母相同的数值。

let foo = "cae"

let pattern = UnicodeScalar("a")..."z"
let charsAsNumbers = foo.lowercaseString.unicodeScalars
    .filter { pattern ~= $0 }
let sumOfNumbers = charsAsNumbers
    .reduce(0) { $0 + $1.value - 96 }

print(sumOfNumbers) // 9

或者,为了简化使用,创建一个函数或String 扩展

/* as a function */
func getNumberSum(foo: String) -> UInt32 {
    let pattern = UnicodeScalar("a")..."z"
    return foo.lowercaseString.unicodeScalars
        .filter { pattern ~= $0 }
        .reduce(0) { $0 + $1.value - 96 }
}

/* or an extension */
extension String {
    var numberSum: UInt32 {
        let pattern = UnicodeScalar("a")..."z"
        return self.lowercaseString.unicodeScalars
            .filter { pattern ~= $0 }
            .reduce(0) { $0 + $1.value - 96 }
    }
}

您的案例的示例用法:

/* example test case (using extension) */
let textField1 = UITextField()
let textField2 = UITextField()
textField1.text = "cAe"
textField2.text = "FCa"

/* example usage */
if let textFieldText1 = textField1.text,
    let textFieldText2 = textField2.text {

        print(textFieldText1.numberSum) // 9
        print(textFieldText2.numberSum) // 10

        print(textFieldText1.numberSum
            == textFieldText2.numberSum) // false
}

【讨论】:

  • Tks,这解决了我的问题,但是如果我需要大写呢?
  • @FabioCarlosSilva 您可以将.lowercaseString 属性附加到上面getNumberSum(...) 函数中每个字符的String 表示。我现在已将其包含在我的答案中(getNumberSum() 已更新)。有关使用扩展的替代方法,请参阅 Leo 提供的链接线程。
猜你喜欢
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2022-07-07
  • 2018-01-10
  • 2021-04-15
相关资源
最近更新 更多