swift 4 - geektuga.ddns.net · core os • contains the low-level features that most other...
TRANSCRIPT
Swift 4
Conteúdos
• O que é
• Swift vs Objective-C
• ARC
Conteúdos• Swift
• Tipos de dados
• int
• String
• Float vs Double
• Literais
•
Conteúdos• Swift
• Variáveis e constantes
• Criação e utilização
• Nomes legais
• Operações
• Tuplos
•
Conteúdos• Swift
• Opcionais
• O que são?
• Opcionais vs Variável / Constante
• Criação
• Utilização
• Funções
Conteúdos• Swift
• Colections
• Array
• Dicionários
• Sets
•
Conteúdos• Swift
• for
• if
• switch/case
• while
•
Conteúdos• Swift
• Classes
• Estruturas
•
O que é?• Linguagem de desenvolvimento Apple
• Funciona com Cocoa e Cocoa Touch
• “Compatível” com Objective-C
• Inspirada em Objective-C, Ruby, Python, C#, etc
• 1 versão publica 9/9/2014
O que é?
• Linguagem moderna
• Escrita eficiente
Swift vs Objective-C
• Necessidade de ;
• Objective-C -> obrigatório
• Swift -> não obrigatório
Swift vs Objective-C• Declaração de variáveis
• Objective-C
• tipo nome=valor;
• Swift
• var nome:tipo = valor
Swift vs Objective-C• Declaração de variáveis (String)
• Objective-C
• NSString *titulo = @“E tudo o vento levou”;
• Swift
• var titulo:String = “E tudo o vento levou”
Swift vs Objective-C• Declaração de métodos
• Objective-C
• modificador(retorno) nome { }
• Swift
• modificador func nome() ->retorno { }
Swift vs Objective-C
• Declaração de métodos
• Objective-C
- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;
• Swift
• modificador func nome(a:Int) ->Int { }
Swift vs Objective-C• declaração de Classes
• Objective-C
• someObject *myobj = [[someObject alloc]init];
• Swift
• var myobj = someObject()
ARC
• ARC = Automatic reference counting
• Limpeza de memoria automatica
• Não disponível em Objective-C
Swift
• Tudo são Objectos
Playground
o que é?
• Ambiente interativo de programação
• Parte integrante do Xcode
Utilizações
• Aprender uma nova linguagem
• Criação de protótipos
• Testar scripts
Alternativa online
Como criar um projecto Playground
Swift
• Demonstração
Swift
• Criação de Variáveis (Inferred data type )
• var name = value: var a = 10 var b = "ola mundo" var c = true
Swift
• Criação de constantes (Inferred data type )
• let name = value: let a = 10 let b = "ola mundo" let c = true
Swift• Criação de var/let com tipo definido
explicitamente
• var name:dataType
let inteiro:Int let bool:Bool var doable:Double let float:Float var str:String
Swift
• Operações com var/let
var soma = 2+2 var div = 2/2 var multip = 3*2 var resto = 10%3
Swift
• Controlo de fluxo
• If
• Switch
Swift
• Controlo de fluxo - > if
if condition { code }
Swift
• Controlo de fluxo - > if
if true { //do something }
Swift
• Controlo de fluxo - > switch
switch Value { case pattern: code default: code }
Swift
• Controlo de fluxo - > switch
switch a { case 1: //do something case 2: //do something default: //do something else }
Demo
Demo
Swift
• Loops
• for
• while
Swift
• Loop - > for
for a in collection{
//do something
}
Swift
• Loop - > while
while true{
//do something
}
iOS Technologies
• The iOS is the operating system that runs on iPad, iPhone, and iPod touch devices.
• The operating system:
• Manages the device hardware and provides the technologies required to implement native apps.
• The iOS Software Development Kit (SDK) contains the tools and interfaces needed to develop, install, run, and test native apps that appear on an iOS device’s Home screen.
• Native apps are built using the iOS system frameworks and Objective-C/Swift languages and run directly on iOS and they are installed physically on a device
The iOS SDK provides the resources you need to develop native iOS apps
The iOS Architecture Is Layered
• It is recommended that you prefer the use of higher-level frameworks over lower-level frameworks whenever possible.
• The higher-level frameworks are there to provide object-oriented abstractions for lower-level constructs.
• These abstractions generally make it much easier to write code because they reduce the amount of code you have to write
• You may use lower-level frameworks and technologies, too, if they contain features not exposed by the higher-level frameworks.
Core OS• Contains the low-level features that most other
technologies are built upon.
• Even if you do not use these technologies directly in your apps, they are most likely being used by other frameworks.
• And in situations where you need to explicitly deal with security or communicating with an external hardware accessory, you do so using the frameworks in this layer.
Core Services
• Contains fundamental system services for apps. Key among these services are the Core Foundation and Foundation frameworks, which define the basic types that all apps use.
• This layer also contains individual technologies to support features such as location, iCloud, social media, and networking.
Core Services
• Peer-to-Peer Services
• iCloud Storage
• File-Sharing Support
• In-App Purchase
Frameworks of the Core Services
• Address Book Framework
• Ad Support Framework
• CloudKit Framework
• Core Data Framework
• Core Location Framework
• HealthKit Framework
• HomeKit Framework
Media Layer
• Contains the graphics, audio, and video technologies you use to implement multimedia experiences in your apps.
• The technologies in this layer make it easy for you to build apps that look and sound great.
Media Layer
• Graphics Technologies
• Audio Technologies
• Video Technologies
• AirPlay
Frameworks of the Media Layer
• Core Audio
• Core Graphics Framework
• Game Controller Framework
• Image I/O Framework
• SpriteKit Framework
Cocoa Touch
• Contains key frameworks for building iOS apps.
• These frameworks define the appearance of your app and provide the basic app infrastructure and support for key technologies such as multitasking, touch-based input, push notifications, and many high-level system services.
Cocoa Touch• App Extensions
• AirDrop
• TextKit
• Multitasking
• Auto Layout
• Storyboards
Frameworks of the Cocoa Touch
• Address Book UI Framework
• GameKit Framework
• iAd Framework
• PushKit Framework
• UIKit Framework
Anatomy of an app
• Uma app iOS é basicamente um conjunto de objectos que envia mensagens para outros objectos
• Uma boa parte dos objectos são fornecidos pela api
•
• No iOS as apps são event-driven o que significa que os objectos estão a “escuta” de determinados eventos e quando eles ocorrem estes são processados
• De forma geral na maioria do tempo uma app esta sem fazer nada, apenas actua quando acontece algum evento
SWIFT 101INTRODUÇÃO AO SWIFT
INTRODUÇÃO AO SWIFT
BASICO
▸ Linguagem Fortemente tipada
▸ Inferência de tipos
▸ Case sensitive
▸ Sem necessidade do ;
▸ “Não há” valores nil (variáveis sem valor)
�2
INTRODUÇÃO AO SWIFT
TIPOS DE DADOS BÁSICOS
▸ String - “Ola mundo @ 2018”
▸ Int - 123456789
▸ Double 1.1234 (Precisão de 15 a 16 casas decimais)
▸ Float 1.2345 (Precisão de 7 casas decimais)
▸ Boolean - true ou false
�3
INTRODUÇÃO AO SWIFT
VARIÁVEIS E CONSTANTES
▸ “caixa de sapatos” onde guardamos valores
▸ Identificador de uma posição em memória onde os dados são armazenados
▸ Variáveis - o seu conteúdo pode mudar
▸ Constantes - depois de inicializadas o seu valor não pode mudar
�4
INTRODUÇÃO AO SWIFT
DECLARAÇÃO - VARIÁVEIS E CONSTANTES
▸ Inferencia de tipo var/let nome = valor
var numero = 10
let numero = true
▸ Tipo Explicito var nome:tipo = valor
var numero:Int = 10
let numero:Int = 10
�5
INTRODUÇÃO AO SWIFT
CASTING - VARIÁVEIS E CONSTANTES
▸ Conversão de tipos NovoTipo(nomeVar)
var x = 10
var z = String(x)
�6
INTRODUÇÃO AO SWIFT
OPERAÇÕES COM VARIÁVEIS E CONSTANTES
▸ Apenas são possíveis operações com variáveis do mesmo tipo
▸ Operações em Swift
▸ +
▸ -
▸ /
▸ *
▸ %
�7
INTRODUÇÃO AO SWIFT
OPERAÇÕES COM VARIÁVEIS E CONSTANTES
▸ Incremento
▸ ++ /- - não disponível
▸ += 1
▸ -= 1
▸ *= 1
�8
INTRODUÇÃO AO SWIFT
TUPLOS
▸ Variáveis que podem conter mais que um elemento
▸ Inferencia de tipo var v1 = (1, “Dois”, true)
let v1 = (id:1, nome:“Dois”, inscrito:true)
▸ tipo Explicito let v1:(Int, String, Bool) = (1, “Dois”, true)
var v1 (id:Int, nome:String, inscrito:Bool) = (id:1, nome:“Dois”, inscrito:true)
�9
INTRODUÇÃO AO SWIFT
ESTRUTURAS DE CONTROLE
▸ if
▸ switch / case
�10
INTRODUÇÃO AO SWIFT
ESTRUTURAS DE CONTROLE - IF
▸ if if condition { code }
▸ switch / case switch Value { case pattern: code default: code }
�11
INTRODUÇÃO AO SWIFT
ESTRUTURAS DE REPETIÇÃO
▸ for
▸ while
▸ do/while
�12
INTRODUÇÃO AO SWIFT
ESTRUTURAS DE REPETIÇÃO
▸ for for a in collection{
//do something
}
▸ while while true{
//do something
}
�13
INTRODUÇÃO AO SWIFT
OPCIONAIS
▸ Variáveis que podem ou não ter valor
▸ Forma de atribuir valor nil
▸ Para serem utilizados tem de ser unwrapped
�14
INTRODUÇÃO AO SWIFT
OPCIONAIS
▸ Criar opcionais var a:Int? // nil
var a:Int? = 10 // Optional(10)
var a:Int? a = 10 // Optional(10)
�15
INTRODUÇÃO AO SWIFT
OPCIONAIS
‣ Operações com opcionais
var a:Int? a = 10 // Optional(10) a = nil // nil
var a:Int a = 10 // 10 a = nil // Erro
�16
INTRODUÇÃO AO SWIFT
OPCIONAIS
▸ unwrap opcionais var a:Int? = 10 // Optional(10)
a! // 10
a // Optional(10)
�17
INTRODUÇÃO AO SWIFT
OPCIONAIS
▸ ! vs ?
�18
INTRODUÇÃO AO SWIFT
OPCIONAIS
▸ unwrap opcionais var a:Int? = 10 // Optional(10)
if let x = a {
print(x) // 10
}
�19
INTRODUÇÃO AO SWIFT
OPCIONAIS
▸ unwrap opcionais var a:Int? = 10 // Optional(10)
var x = a ?? 0 //10
var a:Int? // nil
var x = a ?? 0 // 0
guard let t = a else { return }
�20
INTRODUÇÃO AO SWIFT
COLLECTIONS
▸ Array
▸ Set
▸ Dicionários
�21
INTRODUÇÃO AO SWIFT
COLLECTIONS - ARRAYS
▸ Conjunto ordenado
▸ Os valores são acedidos através do seu index
▸ Criação de arrays let arr:[Int]
▸ Criação de arrays let arr = [] let arr = [1,2,3,4,5,6]
�22
INTRODUÇÃO AO SWIFT
COLLECTIONS - ARRAYS
▸ Adicionar elementos arr.append(10)
▸ Remover elementos var x = arr.popLast()
var x = arr.remove(at: 0)
▸ Aceder a um elemento x[0]
�23
INTRODUÇÃO AO SWIFT
▸ Listar os valores do array for a in arr{
print(a)
}
arr.forEach{ a in
print(a)
}
COLLECTIONS - ARRAYS
�24
INTRODUÇÃO AO SWIFT
COLLECTIONS - DICIONÁRIOS
▸ Conjunto Chave - Valor
▸ Não ordenado
▸ Os valores são acedidos através da seu chave
▸ Criação de Dicionários let dict:[String:String]
▸ Instanciação de Dicionários let dict = [:] let dict = [“nome”:”Gonçalo”, “lastName”:”Feliciano”]
�25
INTRODUÇÃO AO SWIFT
COLLECTIONS - DICIONÁRIOS
▸ Ler elementos dict[key]
▸ Adicionar elementos dict[New key] = new value
▸ Remover elementos dict[key] = nil
�26
INTRODUÇÃO AO SWIFT
▸ Listar os valores do array for a in dic{
print(a)
}
dic.forEach{ a in
print(a)
}
COLLECTIONS - ARRAYS
�27
INTRODUÇÃO AO SWIFT
COLLECTIONS - SETS
▸ Conjuntos de Valores
▸ Não ordenado
▸ Não contem valores repetidos
▸ Criação de Sets let set:Set<String>
▸ Instanciação de Sets let set = Set<String>() let arr:Set = [”ovos”, “açúcar”, “farinha”]
�28
INTRODUÇÃO AO SWIFT
▸ Iterar pelo set for a in set{
print(a)
}
COLLECTIONS - SETS
�29
INTRODUÇÃO AO SWIFT
▸ Adicionar elementos set.insert(“mel")
▸ Remover elementos var x = set.remove(“ovos”)
COLLECTIONS - SETS
�30
INTRODUÇÃO AO SWIFT
COLLECTIONS - SETS
�31
INTRODUÇÃO AO SWIFT
O QUE DEVO SABER NESTE PONTO
▸ Os tipos de dados básicos disponíveis em Swift
▸ Criar e manipular variáveis e constantes
▸ Tuplos
▸ Estruturas de control
▸ Loops
▸ Opcionais
▸ Collections
�32
Swift
Class e Structs
Conteúdos
• O que são classes
• Class vs estruturas
• Como criar classes e estruturas
• Metodos
• Herança
Conteúdos
• Propriedades
• Lazy property
• Propriedades computadas
• Property observer
•
Class
• São o molde para criar objectos
• Tem métodos (funções) e propriedades
• Devem ser declaradas no seu próprio ficheiro
• O seu nome deve começar por maiúscula e ser CamelCase (AlunoUniv)
Class vs estruturas • As estruturas e class têm muito em comum:
• Definem propriedades
• Definem metodos
• Definem sub-scripts
• Podem conter um constructor personalizado
• Entre outras
Class vs estruturas
• as classes podem:
• Herdar de outras classes
• Podem ter mais de uma referência
class / structs
• classes são Reference Type
• structs:
• são value type
• tem um init predefinido
Criar class
class nome{
//codigo da class
}
Criar struct
struct nome{
//codigo da struct
}
Instanciar uma struct
struct resulocao{ var w:Int var h:Int
}
let porjector = resulocao(w:800, h:900)
Instanciar uma class
class aluno{
var nome:String? var idade:Int?
}
let joao = aluno()
joao.nome = “João”
Inicializar uma class
class Carro{ var marca:String private var ano:Int
init(nome:String, ano:Int) { self.marca = nome self.ano = ano }
}
let bmw = Carro(nome:“bmw”, ano:2000)
Operador de identidade
• === -> identica
• !== -> não identica
DEMO
Quando usar Structs
• Agrupar valores simples
• Quando os valores são value type
• Quando não é necessário herdar comportamentos ou propriedades
Quando usar Structs
• Definir formas geométricas
• Coordenadas
• etc
Herança
Herança• Uma class pode herdar métodos e propriedades de outra
• A class que herda é denominada de sub class
• A class da qual se herda é denominada de super class
• É possível aceder a métodos e propriedades
• O overriding é possível
• O swift tem forma de garantir que este processo e feito correctamente
Herança
• Podem ser adicionados observers as propriedades herdadas
Sintax
class SubClass: SuperClass{
//code here
}
Exemplo
class Pessoa{ var nome:String var idade:Int init(nome:String,idade:Int ){ self.nome = nome self.idade = idade } func infos(){ print("\(self.idade), \(self.nome)") } }
Exemplo
class Medico: Pessoa{ var exp:String
init(nome: String, idade: Int, exp:String) { self.exp = exp super.init(nome: nome, idade: idade) } func dados() { super.infos() print("-------------") print(“nome: \(super.nome),\nage: \(super.idade),\nexp: \(self.exp)") } }
Exemplo
var rita = Medico(nome: "rita", idade: 30, exp: "clinica geral") rita.dados()
rita.infos();
DEMO
Overriding
Overriding
• Forma de uma sub class alterar a funcionalidade de instance methods, class methods, instance propertys, class propertys e sub-scripts
• Em Swift é necessário indicar de forma explicita que um método re-escreve um método da super class
Overriding
class Dog { func bark () { print("woof")
} }
class NoisyDog : Dog { override func bark () { print("woof woof woof") } }
Overriding
• Apesar de re-escrito ainda podemos aceder ao método original
Overridingclass Dog { func bark () { print("woof") } }
class NoisyDog : Dog { override func bark () { for _ in 1...3 { super.bark() }
} }
class VeryNoisyDog : Dog { override func bark () { for _ in 1…5 { super.bark() }
} }
Overriding
• Para evitar que algo seja re-escrito deve ser declarado como final
Overriding
class Dog {
final func bark () { print("woof") } }
Overriding
• Com o Overriding a propriedades podemos adicionar gettres e settres observers próprios
• A class que herda não sabe nada das propriedades herdades para alem do seu nome e tipo
Overriding
class SuperCar:Car{ var gear = 1 override var desc: String{ return super.desc + “ in gear \(gear)”
} }
Propriedades
Propriedades
• Uma propriedade e uma variável declarada no top level de um objecto
• Há dois tipos de propriedades
• Instance properties
• Static/class properties.
•
Instance properties• Instance properties
• Se nada foi dito em contrario uma propriedade e sempre instance property.
• O seu valor pode variar a cada instancia da class
• A variável “vive” enquanto a instância a qual esta associada “viver”
•
Static/class properties.
• A property is a static/class property if its declaration is preceded by the keyword static or class.
• Its lifetime is the same as the lifetime of the object type.
Local variables
• A local variable is a variable declared inside a function body.
• A local variable lives only as long as its surrounding curly-braces scope lives
Computed Initializer
Computed Initializer
• Por vezes necessitados de ter varias linhas de código para inicializar uma variável, em Swift isto pode ser feito de forma compacta
Computed Initializer
let timed : Bool = { if val == 1 { return true } else { return false } }()
Computed Variables
Computed Variables
• Até agora inicializamos variáveis atribuindo-lhe um valor.
• Em Swift as variáveis pode ser computadas, ou seja em vez de terem valores têm funções
• setter - chamada quando lhe e atribuído valor
• getter - chamada quando acedemos ao “valor” ou seja quando esta e referida
Computed Variables
• As variáveis computadas podem ser usadas nas mais vaiadas situações
• Variáveis so de leitura
• Façade for a function
• Façade for other variables
Computed Variables
class Quadrado { var lado:Float? var area:Float { set{ self.lado = sqrt(newValue) } get{ return pow(self.lado!, 2) } } var perimetro:Float { set{ self.lado = newValue/4 } get{ return self.lado! * 4 } } }
Variáveis so de leitura
• As variáveis computadas pode ser apenas de leitura ou seja não sendo possível serem alteradas
Variáveis so de leitura
var estado : String { get { if media >= 9.5 { return "Aprovado com media de \(self.media)" }else{ return "não aprovado com media de \(self.media)" } } }
Façade for a function
• Variáveis computadas podem retornar apenas o resultado de uma função
Façade for a function
var mp : MPMusicPlayerController { return MPMusicPlayerController.systemMusicPlayer() }
Façade for other variables
• Uma variável computada pode fazer de “interface” entre o utilizador e o programa, funcionando como um “gatekeeper”
• Semelhante ao getter e setter em C#
Façade for other variables
private var _p : String
var p : String { get { return self._p
} set {
self._p = newValue }
}
Setter Observers
Setter Observers
• Outra forma de injectar funcionalidade em settres
• Os Observers são funções chamadas antes e depois de uma variável ser alterada
• Não são chamados quando a variável e inicializada
Setter Observers
var s = "whatever" { willSet { print(newValue) }
didSet { print(oldValue)
} }
DEMO
Lazy property
Lazy property
• Se uma variável e inicializada com um determinado valor e for usada a lazy initialization este valor só é avaliado quando o programa tenta aceder a essa variável
Lazy property
• Em Swift há 3 tipos de propriedades que podem ser “lazy”
• Variáveis Globais
• Static properties
• Instance properties
Lazy property
• As Lazy instance properties:
• Não podem ser let
• Não podem ter observers
• Não podem ser so de leitura
Lazy property
• Para que serve?
• Em que situações faz sentido que sejam usadas ?
Lazy property
• Quando o valor inicial e “caro” de gerar / ler
• Quando o seu valor depende de factores externos
Lazy property
• Podem fazer coisas que as propriedades normais não podem:
• Podem-se referir a propria instancia
Lazy property
class MyView : UIView {
lazy var arrow : UIImage = self.arrowImage()
func arrowImage () -> UIImage { // ... big image-generating code goes here ... }
}
Protocolos
Protocolos
• Implementam um “blueprint” de métodos e propriedades
• Forma de partilhar propriedades e funcionalidades por objectos não relacionados
• Atribui um novo tipo ao objecto
• Semelhante as interfaces do Java / C#
Protocolos
protocol someProtocol {
//code goes here
}
Protocolos
• Podem ser implementados tanto em class como em struts
Protocolos
struct structName: protocolA, protocolB {
//code goes here
}
Protocolos
class className: superClass, protocolA, protocolB {
//code goes here
}
Protocolos• Tudo o que estiver declarado no protocolo deve ser
implementado
• Pode implementar protocolos
• Se o protocolo implementa uma propriedade
• Com getter e settres nunca poderá ser declarada como constante ou de leitura
• Se apenas tiver implementado o getter, pode ser declarada como qualquer propriedades
Protocolos
protocol SomeProtocol {
var someInt:Int {get set} var someOtherInt:Int {get}
}
Protocolos
protocol SomeProtocol2 {
func random() -> Double
}
Protocolos
class className: SomeProtocol, SomeProtocol2 {
var someInt: Int = 0; var someOtherInt: Int = 0;
func random() -> Double{
//code goes here
}
}
Qual a importancia dos Protocolos?
Protocolos
• Usado em alguns design patterns
• Polimorfismo