Swift 4 - geektuga.ddns.net · Core OS • Contains the low-level features that most other...

Post on 04-Jul-2020

0 views 0 download

Transcript of Swift 4 - geektuga.ddns.net · Core OS • Contains the low-level features that most other...

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