ios 8 com swift
DESCRIPTION
Aprenda o Swift e como usá-lo no iOS 8TRANSCRIPT
IOS 8 COM SWIFTNovidades e a Nova Linguagem da Apple
VARIÁVEIS
• Podem ter o tipo inferido pelo compilador
• Declaradas com a expressão var var oi: String = "Oi Mundo" var oi = "Oi Mundo"
• Constantes declaradas com a expressão let let msg: String = "Oi Mundo" let texto = "Oi Mundo"
STRINGS
• Concatenadas com o sinal + let titulo = “Palestra de Swift" let opiniao = "Maravilhosa!" let descricao = titulo + " -‐ " + opiniao
• Podem ser interpoladas com variáveis let dataPublicacao = "29 de Novembro de 2014” let artigoBlog = "Artigo publicado em: \(dataPublicacao)"
ENUMERAÇÕESenum Valor: Int { case As = 1 case Dois, Tres, Quatro, Cinco, Seis, Setes, Oito, Nove, Dez case Valete, Rainha, Rei func descricao() -‐> String { switch self { case .As: return "as" case .Valete: return "valete" case .Rainha: return "rainha" case .King: return "rei" default: return String(self.rawValue) } } } !let as = Valor.As let valorAs = as.rawValue
ENUMERAÇÕESenum Naipe { case Espadas, Copas, Diamonds, Paus func descricao() -‐> String { switch self { case .Espadas: return "espadas" case .Copas: return "copas" case .Ouro: return "ouro" case .Paus: return "paus" } } } !let copas = Naipe.Copas let copasDescricao = copas.descricao()
ESTRUTURAS
struct Carta { var valor: Valor var naipe: Naipe func descricao() -‐> String { return "\(valor.descricao()) de \(naipe.descricao())" } } !let tresDeEspadas = Carta(valor: .Tres, naipe: .Espadas) let descricaoTresDeEspadas = tresDeEspadas.descricao()
OUTROS TIPOS DE DADOS• Inteiro
• Int
• Ponto flutuante
• Double : 64 bits
• Float : 32 bits
• Booleano
• Bool
COLEÇÕES – ARRAY• Declaração
var nomesCartas: String[] = ["Valete", "Rainha", "Rei"] var nomesCartas = ["Valete", "Rainha", "Rei"]
• Adicionar item nomesCartas += "Ás" nomesCartas += ["2", "3", "4", "5", "6", "7", "8", "9", "10"]
• Remover item ss
• Substituir item tarefas[0] = "Revistar o Artigo do Blog" tarefas[2..<5] = ["Pegar Roupas","Pegar Comida", "Fazer Jantar"]
COLEÇÕES – DICTIONARY• Declaração
var cartas = ["Valete" : 11, "Rainha" : 12, "Rei" : 13]
• Adicionar item cartas["Valete"] = 11
• Remover item ss
• Substituir item cartas["Valete"] = 11 cartas["Rainha"] = 12 cartas["Rei"] = 13
CONTROLE DE FLUXO
while condicao { println("repetição") } !!var mensagem = "Começando o download" do { println(mensagem) mensagem = "Fazendo dowload.." } while !completo
CONTROLE DE FLUXO
var nomesCartas = ["Valete", "Rainha", "Rei"] !for var i = 1; i < nomesCartas.count; ++i { println(nomesCartas[i]) } !for cardName in cardNames { println(cardName) }
CONTROLE DE FLUXO
for numero in 1...10 { println("\(numero) vezes 2 é \(numero*2)") }
!var cartas = ["Valete" : 11, "Rainha" : 12, "Rei" : 13]
!for (nome, valor) in cartas { println("\(nome) = \(valor)") }
CONDICIONAISif valorCarta == 11 { println("Valete") } else if valorCarta == 12 { println("Rainha") } else { println("Desconhecido") } !switch valorCarta { case 11: println("Valete") case 12: println("Rainha") default: println("Desconhecido") }
CONDICIONAISvar usuarios: User[] = [ ... ] var host = /* algum usuário */ !for usuario in usuarios { if usuario === host { ! println("este é o host") } else { ! println("este é um convidado") } }
CONDICIONAIS
switch distancia { case 0: println("inválida") case 1,2,3,4,5: println("perto") case 6,7,8,9,10: println("longe") default: println("muito longe") }
switch distancia { case 0: println("inválida") case 1..5: println("perto") case 6..10 : println("longe") default: println("muito longe") }
FUNÇÕES
func imprimeCarta(nomeCarta: String, valorCarta: Int) { println("\(nomeCarta) = \(valorCarta)") } !func imprimeCarta(nomeCarta: String, valorCarta: Int) -‐> String { return "\(nomeCarta) = \(valorCarta)" }
OPCIONAIS• Permitem ter variáveis sem valor (nil)
• Podem estar em parâmetros de funções, em seu retorno ou declarações de variáveis
var x: Float? var y: Float? !x = 1.2 y = nil !func adiciona(x:Float?, y:Float?) -‐> Float { if x && y { return x + y } else { return nil } }
OPCIONAISfunc encontraAcao(empresa: String) -‐> String? { if (empresa == "Apple") { return "AAPL" } else if (empresa == "Google") { return "GOOG" } ! return nil } !var acao:String? = encontraAcao("Facebook") let texto = "Código da Ação -‐ " let menssagem = texto + acao // Erro de compilação aqui println(menssagem)
OPCIONAIS E UNWRAPPINGfunc encontraAcao(empresa: String) -‐> String? { if (empresa == "Apple") { return "AAPL" } else if (empresa == "Google") { return "GOOG" } ! return nil } !var acao:String? = encontraAcao("Facebook") let texto = "Código da Ação -‐ " if acao { let menssagem = texto + acao! println(menssagem) }
OPCIONAIS E UNWRAPPINGfunc encontraAcao(empresa: String) -‐> String? { if (empresa == "Apple") { return "AAPL" } else if (empresa == "Google") { return "GOOG" } ! return nil } !var acao:String? = encontraAcao("Facebook") let texto = "Código da Ação -‐ " if let acaoTemp = acao { let mensagem = texto + acaoTemp println(mensagem) }
OPCIONAIS E UNWRAPPINGfunc encontraAcao(empresa: String) -‐> String? { if (empresa == "Apple") { return "AAPL" } else if (empresa == "Google") { return "GOOG" } ! return nil } !let texto = "Código da Ação -‐ " if var acao = encontraAcao("Facebook") { let mensagem = texto + acaoTemp println(mensagem) }
OPCIONAIS E UNWRAPPINGclass Acao { var codigo: String? var preco: Double? } !func encontraAcao(empresa: String) -‐> Acao? { if (empresa == "Apple") { let aapl: Acao = Acao() aapl.codigo = "AAPL" aapl.preco = 90.32 return aapl } else if (empresa == "Google") { let goog: Acao = Acao() goog.codigo = "GOOG" goog.preco = 556.36 return goog } return nil }
OPCIONAIS E ENCADEAMENTO
if let acao = encontraAcao("Apple") { if let precoAcao = acao.preco { let custoTotal = precoAcao * 100 println(custoTotal) } } !if let precoAcao = encontraAcao("Apple")?.preco { let custoTotal = precoAcao * 100 println(custoTotal) }
VALORES PADRÃO (DEFAULT)
• Podem ser usados em parâmetros para torná-los opcionais
func adiciona(x:Float?, y:Float?, z:Float = 0.0) -‐> Float { return x + y + z }
CLASSES
class Ponto { var x = 0.0 var y = 0.0 } !var ponto = Ponto() !ponto.x = 100 ponto.y = 200
class Ponto { var x: Float var y: Float ! init(x: Float, y: Float) { self.x = x self.y = y } } !var ponto = Ponto(x: 100, y: 200)
HERANÇAclass ClasseMae { func fazAlgo() { println("Olá da Classe Mãe") } } !class Subclasse: ClasseMae { override func fazAlgo() { super.fazAlgo() println("Olá da Subclasse") } }
PROTOCOLOS• Funcionam como interfaces em outras linguagens
• Mas podem ter a implementação opcional protocol Miravel { var vida: Int { get set } func tomarDano(dano: Int) } !protocol Atiravel { func atirar(alvo: Miravel) }
PROTOCOLOS
class Pistola: Atiravel { func atirar(target: Miravel) { alvo.tomarDano(1) } } !class Rifle: Atiravel { func atirar(alvo: Miravel) { alvo.tomarDano(5) } }
PROTOCOLOSclass Inimigo: Miravel { var vida: Int = 10 ! func tomarDano(dano: Int) { vida -‐= dano println("inimigo perdeu \(dano) pontos de vida") ! if vida <= 0 { println("o inimigo está morto agora") } } }
PROTOCOLOS
class Jogador { var arma: Atiravel! ! init(arma: Atiravel) { self.arma = arma } ! func atirar(alvo: Miravel) { arma.atirar(alvo) } }
EXTENÇÕESprotocol protocoloExemplo { var descricao: String { get } mutating func ajuste() } !extension Int: protocoloExemplo { var descricao: String { return "O número é \(self)" } mutating func ajuste() { self += 42 } } !7.descricao