Итак, у вас есть кошка, есть много способов ее обработать.
Вы можете "сделать" шифр неизменяемым, предоставив конструктор, который не может быть выполнен, например ...
struct CeaserCipher {
let secret: Int
init?(string: String) {
guard let value = Int(string) else { return nil }
secret = value
}
}
Это не мешает вам иметь дело с опционами, но это означает, что экземпляр CeaserCipher
будет действительным.
struct
выполняет по крайней мере одно требование, что у вас естьнеобязательный String
, поэтому вам нужно будет сначала подтвердить это
Так что, если вы сделали что-то вроде ...
let cipher = CeaserCipher(string: "Bad")
cipher
будет nil
, и вы 'Мне нужно было с этим справиться, но если бы вы сделали что-то вроде ...
let cipher = CeaserCipher(string: "123456789")
cipher
было бы допустимым экземпляром, и вы могли бы работать с ним.
Использование guard
и if let
здесь важны, так как они позволят вам избежать сбоя кода, который вы будете использовать, зависит от ваших потребностей.
guard let cipher = CeaserCipher(string: "123456789") else {
// Cipher is invalid, deal with it...
return
}
// Valid cipher, continue to work with it
или
if let cipher = CeaserCipher(string: "123456789") {
// Valid cipher, continue to work with it
} else {
// Cipher is invalid, deal with it...or not
}
СутьНапример, вы получите действительный экземпляр CeaserCipher
или nil
, который «в целом» более безопасен, чем экземпляр, которыйон находится в недопустимом состоянии и, как правило, с ним легче иметь дело