IOS 8 COM SWIFT 
Novidades 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ÇÕES 
enum 
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ÇÕES 
enum 
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)") 
}
CONDICIONAIS 
if 
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") 
}
CONDICIONAIS 
var 
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 
} 
}
OPCIONAIS 
func 
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 UNWRAPPING 
func 
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 UNWRAPPING 
func 
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 UNWRAPPING 
func 
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 UNWRAPPING 
class 
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ÇA 
class 
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) 
} 
}
PROTOCOLOS 
class 
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ÇÕES 
protocol 
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

iOS 8 com swift

  • 1.
    IOS 8 COMSWIFT Novidades e a Nova Linguagem da Apple
  • 2.
    VARIÁVEIS • Podemter 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"
  • 3.
    STRINGS • Concatenadascom 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)"
  • 4.
    ENUMERAÇÕES enum 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
  • 5.
    ENUMERAÇÕES enum 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()
  • 6.
    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()
  • 7.
    OUTROS TIPOS DEDADOS • Inteiro • Int • Ponto flutuante • Double : 64 bits • Float : 32 bits • Booleano • Bool
  • 8.
    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"]
  • 9.
    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
  • 10.
    CONTROLE DE FLUXO while condicao { println("repetição") } ! ! var mensagem = "Começando o download" do { println(mensagem) mensagem = "Fazendo dowload.." } while !completo
  • 11.
    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) }
  • 12.
    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)") }
  • 13.
    CONDICIONAIS if 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") }
  • 14.
    CONDICIONAIS var usuarios: User[] = [ ... ] var host = /* algum usuário */ ! for usuario in usuarios { if usuario === host { ! println("este é o host") } else { ! println("este é um convidado") } }
  • 15.
    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") }
  • 16.
    FUNÇÕES func imprimeCarta(nomeCarta: String, valorCarta: Int) { println("(nomeCarta) = (valorCarta)") } ! func imprimeCarta(nomeCarta: String, valorCarta: Int) -­‐> String { return "(nomeCarta) = (valorCarta)" }
  • 17.
    OPCIONAIS • Permitemter 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 } }
  • 18.
    OPCIONAIS func 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)
  • 19.
    OPCIONAIS E UNWRAPPING func 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) }
  • 20.
    OPCIONAIS E UNWRAPPING func 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) }
  • 21.
    OPCIONAIS E UNWRAPPING func 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) }
  • 22.
    OPCIONAIS E UNWRAPPING class 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 }
  • 23.
    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) }
  • 24.
    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 }
  • 25.
    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)
  • 26.
    HERANÇA class ClasseMae { func fazAlgo() { println("Olá da Classe Mãe") } } ! class Subclasse: ClasseMae { override func fazAlgo() { super.fazAlgo() println("Olá da Subclasse") } }
  • 27.
    PROTOCOLOS • Funcionamcomo 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) }
  • 28.
    PROTOCOLOS class Pistola: Atiravel { func atirar(target: Miravel) { alvo.tomarDano(1) } } ! class Rifle: Atiravel { func atirar(alvo: Miravel) { alvo.tomarDano(5) } }
  • 29.
    PROTOCOLOS class 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") } } }
  • 30.
    PROTOCOLOS class Jogador { var arma: Atiravel! ! init(arma: Atiravel) { self.arma = arma } ! func atirar(alvo: Miravel) { arma.atirar(alvo) } }
  • 31.
    EXTENÇÕES protocol 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