如何解开Optionals,我怎么写这段代码没有?要么 !还是有可能?

时间:2019-04-10 00:06:32

标签: swift

我很难重写这段代码,所以没有可选的?在里面还是强行拆开!到目前为止,我已经能够使用它,但是在输出中带有可选项。我希望输出中没有可选内容。

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)

1 个答案:

答案 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将是有效的实例,您可以使用它。

在这里重要的是使用guardif 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
}

该示例的要点是,您将获得CeaserCiphernil的有效实例,与拥有无效状态且通常更容易的实例相比,它“通常”更安全处理