我很难重写这段代码,所以没有可选的?在里面还是强行拆开!到目前为止,我已经能够使用它,但是在输出中带有可选项。我希望输出中没有可选内容。
class CeaserCipher {
var secret: Int? = 0
func setSecret(_ maybeString: String?) {
guard let stringSecret = maybeString else {
return
}
self.secret = Int(stringSecret)
}
}
let cipher = CeaserCipher()
cipher.setSecret(nil)
print(cipher.secret)
cipher.setSecret("ten")
print(cipher.secret)
cipher.setSecret("125")
print(cipher.secret)
答案 0 :(得分:0)
所以,你有一只猫,有很多方法可以给它剥皮。
例如,通过提供可失败的构造函数,您可以“使密码不可变”。
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
的有效实例,与拥有无效状态且通常更容易的实例相比,它“通常”更安全处理