A Swift atribui um alto valor à segurança do tipo. Toda a linguagem Swift foi projetada com segurança em mente. É uma das marcas registradas da Swift e que você deve receber de braços abertos. Ele ajudará no desenvolvimento de código limpo e legível e ajudará a impedir que seu aplicativo falhe.
Todos os opcionais no Swift são demarcados com o ?
símbolo. Ao definir o ?
depois do nome do tipo em que você está declarando como opcional, você basicamente está convertendo isso não como o tipo anterior a ?
, mas como o tipo opcional .
Nota: Uma variável ou tipo nãoInt
é o mesmo que . São dois tipos diferentes que não podem ser operados um com o outro.Int?
Usando opcional
var myString: String?
myString = "foobar"
Isso não significa que você está trabalhando com um tipo de String
. Isso significa que você está trabalhando com um tipo de String?
(String Optional ou Optional String). De fato, sempre que você tenta
print(myString)
em tempo de execução, o console de depuração será impresso Optional("foobar")
. A Optional()
parte " " indica que esta variável pode ou não ter um valor em tempo de execução, mas acontece que atualmente está contendo a string "foobar". Esta Optional()
indicação " " permanecerá, a menos que você faça o que é chamado "desembrulhando" o valor opcional.
Desembrulhar um opcional significa que agora você está convertendo esse tipo como não opcional. Isso irá gerar um novo tipo e atribuir o valor que residia dentro desse opcional ao novo tipo não opcional. Dessa forma, você pode executar operações nessa variável, pois foi garantido pelo compilador um valor sólido.
O desempacotamento condicional verificará se o valor no opcional é nil
ou não. Caso contrário nil
, haverá uma variável constante recém-criada, à qual será atribuído o valor e desembrulhado na constante não opcional. E a partir daí você pode usar com segurança o não opcional no if
bloco.
Nota: Você pode dar à sua constante desembrulhada condicionalmente o mesmo nome da variável opcional que está sendo desembrulhada.
if let myString = myString {
print(myString)
// will print "foobar"
}
Desdobrar condicionalmente os opcionais é a maneira mais limpa de acessar o valor de um opcional, porque se ele contiver um valor nulo, tudo dentro do bloco if let não será executado. Obviamente, como qualquer instrução if, você pode incluir um bloco else
if let myString = myString {
print(myString)
// will print "foobar"
}
else {
print("No value")
}
O desembrulhamento forçado é feito empregando o que é conhecido como !
operador ("bang"). Isso é menos seguro, mas ainda permite que seu código seja compilado. No entanto, sempre que você usa o operador bang, você deve ter 1000% de certeza de que sua variável realmente contém um valor sólido antes de desembrulhar à força.
var myString: String?
myString = "foobar"
print(myString!)
Isso acima é um código Swift totalmente válido. Ele imprime o valor myString
definido como "foobar". O usuário veria foobar
impresso no console e é isso. Mas vamos assumir que o valor nunca foi definido:
var myString: String?
print(myString!)
Agora temos uma situação diferente em nossas mãos. Diferentemente do Objective-C, sempre que é feita uma tentativa de desembrulhar à força um opcional, o opcional não foi definido e é nil
, quando você tenta desembrulhar o opcional para ver o que está dentro do seu aplicativo falhará.
Desembrulhando w / Type Casting . Como dissemos anteriormente, enquanto você é unwrapping
o opcional, na verdade, está convertendo para um tipo não opcional, também pode converter o não opcional para um tipo diferente. Por exemplo:
var something: Any?
Em algum lugar do nosso código, a variável something
será definida com algum valor. Talvez estejamos usando genéricos ou talvez exista alguma outra lógica que faça com que isso mude. Portanto, mais tarde em nosso código, queremos usar, something
mas ainda podemos tratá-lo de maneira diferente se for um tipo diferente. Nesse caso, você desejará usar a as
palavra-chave para determinar isso:
Nota: O as
operador é como você digita a conversão em Swift.
// Conditionally
if let thing = something as? Int {
print(thing) // 0
}
// Optionally
let thing = something as? Int
print(thing) // Optional(0)
// Forcibly
let thing = something as! Int
print(thing) // 0, if no exception is raised
Observe a diferença entre as duas as
palavras-chave. Como antes, quando desembrulhamos à força um opcional, usamos o !
operador bang para fazer isso. Aqui você fará a mesma coisa, mas, em vez de lançar como apenas um não opcional, você também estará lançando como Int
. E deve poder ser abatido Int
, caso contrário, como usar o operador bang quando o valor for nil
seu aplicativo falhará.
E para usar essas variáveis em algum tipo ou operação matemática, elas devem ser desembrulhadas para fazer isso.
Por exemplo, no Swift, apenas tipos de dados de número válido do mesmo tipo podem ser operados um contra o outro. Quando você lança um tipo com as!
você, está forçando o downcast dessa variável como se tivesse certeza de que é desse tipo, portanto, é seguro operar e não travar seu aplicativo. Tudo bem, desde que a variável seja do tipo para a qual você está lançando, caso contrário, você terá uma bagunça nas mãos.
No entanto, a conversão com as!
permitirá que seu código seja compilado. Fundir com um as?
é uma história diferente. De fato, as?
declara o seu Int
como um tipo de dados completamente diferente.
Agora é Optional(0)
E se você já tentou fazer sua lição de casa escrevendo algo como
1 + Optional(1) = 2
Seu professor de matemática provavelmente teria lhe dado um "F". O mesmo com Swift. Exceto que Swift prefere não compilar, em vez de dar uma nota. Porque no final do dia, o opcional pode de fato ser nulo .
Segurança First Kids.