Swift4 Playgrounds Caesar Cipher错误

时间:2017-12-03 23:22:36

标签: swift algorithm caesar-cipher

我正在尝试在Swift Playgrounds中制作一个caesar密码,但每当该字母为例如“W”并且我试图将它移动4时,而不是得到“A”我只是得到一个错误。如果ascii代码+ shift不超过Z的ascii代码,它可以正常工作,否则我得到

  

错误:执行被中断,原因:EXC_BAD_INSTRUCTION   (code = EXC_I386_INVOP,subcode = 0x0)。

这是我的代码:

func cipher(messageToCipher: String, shift: UInt32) {
    var ciphredMessage = ""

    for char in messageToCipher.unicodeScalars {
        var unicode : UInt32 = char.value

        if char.value > 64 && char.value < 123 {
            var modifiedShift = shift
            if char.value >= 65 && char.value <= 90 {
                while char.value + modifiedShift > 90 {
                 //return to A
                    modifiedShift -= 26
                }
            } else if char.value >= 97 && char.value <= 122 {
                while char.value + modifiedShift > 122 {
                  //return to a
                    modifiedShift -= 26
                }
            }

            unicode = char.value + modifiedShift
        }

        ciphredMessage += String(UnicodeScalar(unicode)!)
    }

    print(ciphredMessage)
}

当有字母+移位的ascii代码超过“z”的ascii代码时,有人能告诉我为什么会出错吗?

2 个答案:

答案 0 :(得分:3)

shiftUInt32。因此,对于var modifiedShift = shiftmodifiedShift也被推断为UInt32。因此,当您将modifiedShift设置为4,然后尝试从中减去26时,这不是可接受的UInt32值。

底线,使用有符号整数。

答案 1 :(得分:1)

问题是modifiedShift的值可能是负值,而{type 1}}类型的值不允许这样做,所以我建议只在可能的情况下使用UInt32

Int

注意:您还可以使用// use `Int` for `shift` func cipher(messageToCipher: String, shift: Int) { var ciphredMessage = "" for char in messageToCipher.unicodeScalars { // convert to `Int` var unicode = Int(char.value) if unicode > 64 && unicode < 123 { var modifiedShift = shift if unicode >= 65 && unicode <= 90 { while unicode + modifiedShift > 90 { //return to A modifiedShift -= 26 } } else if unicode >= 97 && unicode <= 122 { while unicode + modifiedShift > 122 { //return to a modifiedShift -= 26 } } unicode += modifiedShift } ciphredMessage += String(UnicodeScalar(unicode)!) } print(ciphredMessage) } 进行范围匹配。以下几行在语义上是等效的:

if case