Swift – Tuplas e Optionals

1 de novembro de 2016   |   by administrador
// 1 - Tuplas (Tuples)

/*
Tuplas - Uma das novidades da linguagem Swift
Elas agrupam valores em um único elemento
Os valores podem ser de qualquer tipo de dados
*/

let codErro = 404
let descErro = "Not Found"

// Com a tupla, conseguimos definir tipos diferentes em um mesmo elemento
let http404Error = (404, "Not Found")
// http404Error é do tipo (Int, String)

// Como exibir as informações?
// 1 - Por decomposição
let (statusCode, statusMessage) = http404Error
print("O código de erro é \(statusCode)")
print("A mensagem de erro é \(statusMessage)")

// 2 - Por índice
print("O código de erro é \(http404Error.0)")
print("A mensagem de erro é \(http404Error.1)")

// Podem ser atribuídos nomes aos campos
let httpStatus = (statusCode: 200, descricao: "OK")

// Exibindo as informações pelo nome
print("O código de retorno é \(httpStatus.statusCode)")
print("A mensagem de retorno é \(httpStatus.statusCode)")

/*
Optionals
Outro novo recurso da linguagem Swift, visando tornar os apps mais seguros e

menos sujeitos a falhas

Os Optionals são utilizados em situações onde pode haver valores inesperados ou

ausência de valor
Em um Optional, dizemos que:
1) Há um valor, e ele é ugial a (x), OU
2) Não há um valor, absolutamente (valueless)
*/

// Inicialmente, veremos um código sem proteção, onde a finalidade é converter uma

//string em um inteiro, e posterormente efetuar um cálculo com esse valor
let possivelNumero: String = "abc"
//var numeroConvertido = Int(possivelNumero)
// numeroConvertido foi inferido para Int

//numeroConvertido! += 10
// Forced Wrapping - "garanto" que não haverá ausência de valor - assumo a responsabilidade

// Verificação reativa
//if numeroConvertido != nil {
// numeroConvertido! += 10
// print(numeroConvertido)
//} else {
// print("Não foi possível converter o valor")
//}

// Para tratar com Optionals, a melhor forma é ser pro-ativo

// Solução mais sustentável
// Através do recurso que se chama Optional Binding
if let numeroReal = Int(possivelNumero) {
print("O valor da variável convertida é \(numeroReal)")
print(numeroReal)
} else {
print("Não foi possível converter o valor")
}

// Como indicar que um elemento pode ser um Optional
// Atrvés do uso do ponto de interrogação (?)
let nomeUsuario: String?

nomeUsuario = "Jones"

//let cumprimento = "Olá " + nomeUsuario + ". Seja bem-vindo"
//print(cumprimento)

// DESAFIO
// Como resolver a situação acima de forma segura?

// Verificar se nomeUsuario tem um valor válido antes de trabalhar com ele
// Na Swift, através do Optional Binding
if let nomeValido = nomeUsuario {
let cumprimento = "Olá " + nomeValido + ". Seja bem-vindo"
print(cumprimento)
} else {
print("Nome de Usuário tem um valor inválido ou ausência de valor")
}

// Mais um exemplo de Optional, efetuando uma dupla verificação
var nome: String?
var sobreNome: String?

nome = "Jones "
sobreNome = "Carvalho"

// Iremos utilizar o Optional Binding para garantir que os campos tenha valor válido
if let primeiroNome = nome, let segundoNome = sobreNome {
let nomeCompleto = primeiroNome + segundoNome
} else {
print("Há algum problema com os nomes. Favor verificar")
}