Как развернуть опционально, как я могу написать этот код, чтобы не иметь?или же !в нем или это возможно? - PullRequest
0 голосов
/ 10 апреля 2019

Мне трудно переписать этот код, чтобы не было опций?в нее или разложи!До сих пор я был в состоянии заставить его работать, но с дополнительным в выводе.Я бы хотел, чтобы в выводе не было опционального.

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 голосов
/ 10 апреля 2019

Итак, у вас есть кошка, есть много способов ее обработать.

Вы можете "сделать" шифр неизменяемым, предоставив конструктор, который не может быть выполнен, например ...

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, который «в целом» более безопасен, чем экземпляр, которыйон находится в недопустимом состоянии и, как правило, с ним легче иметь дело

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...