我正在尝试在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代码时,有人能告诉我为什么会出错吗?
答案 0 :(得分:3)
shift
是UInt32
。因此,对于var modifiedShift = shift
,modifiedShift
也被推断为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