Entrevista - 10 perguntas sobre Swift. Parte 2

Há menos e menos tempo até o lançamento do curso "iOS Developer" , então hoje continuamos a publicar material da série "10 perguntas sobre Swift". A primeira parte pode ser lida aqui .



Explique os genéricos no Swift?


Os genéricos (modelos genéricos) permitem escrever funções e tipos flexíveis e reutilizáveis ​​que podem funcionar com qualquer tipo. Você pode escrever um código que evite duplicação e expresse sua finalidade de maneira clara e abstrata.

Os tipos de matriz e dicionário no Swift são coleções universais (genéricos).
No código abaixo, uma função universal para trocar dois valores é usada para uma sequência e um número inteiro. Este é um exemplo de código reutilizável.

func swapTwoValues<T>(_ a: inout T, _ b: inout T) { let temporaryA = a a = b b = temporaryA } var num1 = 4 var num2 = 5 var str1 = “a” var str2 = “b” swapTwoValues(&num1,&num2) swapTwoValues(&str1,&str2) print (“num1:”, num1) //output: 5 print (“num2:”, num2) //output: 4 print (“str1:”, str1) //output: b print (“str2:”, str2) //output: a 

O que são tipos opcionais no swift e quando devem ser usados?


Opcional (Opcional, “opcional”) em Swift é o tipo em que o valor pode ou não ser. As opções são indicadas adicionando "?" para qualquer tipo.

Opções para usar o opcional:

  1. Trechos de código que podem falhar (eu esperava algo, mas não recebi nada).
  2. Objetos que estão vazios no momento, mas podem se tornar algo mais tarde (e vice-versa).

Um bom exemplo de um opcional:

Uma propriedade que pode ou não estar presente , como um nome do meio ou marido / esposa na classe Pessoa.

Um método que pode retornar um valor ou nada , por exemplo, correspondente em uma matriz.

Um método que pode retornar um resultado ou obter um erro e não retornar nada , por exemplo, tenta ler o conteúdo do arquivo (como resultado do qual os dados do arquivo geralmente serão retornados), mas o arquivo não existe.

Delegar propriedades que nem sempre precisam ser definidas e geralmente definidas após a inicialização.

Como elos fracos nas aulas . O que eles apontam pode ser definido a zero a qualquer momento.

Se você precisar descobrir como o valor está definido (dados ainda não carregados> dados) em vez de usar uma variável booleana separada dataLoaded.

O que é encadeamento opcional no Swift?


Os processos de solicitação, chamada de propriedades, subscritos e métodos para um opcional, que pode ter o valor "nil", são definidos como uma sequência opcional (cadeia opcional) .

A sequência opcional retorna dois valores -
  • se a opção contiver um "valor", quando as propriedades, métodos e subscritos associados forem chamados, o valor será retornado
  • se um opcional contiver "nulo", todas as propriedades, métodos e subscritos associados a ele retornarão nulo

Uma sequência opcional é uma alternativa à descompactação forçada.

O que é desembrulhar forçado?


A descompactação forçada é uma maneira de recuperar o valor contido em um opcional. Esta operação é perigosa porque você está basicamente dizendo ao compilador: Tenho certeza de que esta opção contém um valor real, extraia-o!

 let value: Int? = 1 let newValue: Int = value! //  newValue  1 let anotherOptionalInt: Int? = nil let anotherInt = anotherOptionalInt! // Output:fatal error:  nil    . 

O que é desembrulhar implícito?


Descompactação implícita : quando definimos uma opção descompactada implicitamente, definimos um contêiner que forçará automaticamente a descompactação toda vez que o lermos.

 var name: String! = “Viratlet student = name //       name = nil let player = name //Output:fatal error:  nil    . 

Se o opcional implicitamente descompactado for nulo e você estiver tentando acessar seu valor compactado, você lançará um erro de tempo de execução. O resultado é exatamente o mesmo que se você colocasse um ponto de exclamação após o opcional habitual, que não contém um valor.

O que é ligação opcional?


Você pode descompactar as opções de maneira "segura" ou "insegura". Uma maneira segura é usar ligantes opcionais.

A ligação opcional é usada para determinar se um opcional contém um valor e, nesse caso, disponibilizaremos esse valor como constante ou variável de tempo. Portanto, não há necessidade de usar um sufixo! para acessar seu valor.

 let possibleString: String? = "Hello" if let actualString = possibleString { //actualString -  ( )   // ,   possibleString print(actualString) } else { //possibleString   ,   // } 

O que é um Guard e quais são seus benefícios?


A declaração de guard é simples e poderosa. Ele verifica alguma condição e, se for avaliada como falsa, a instrução else é executada, o que geralmente encerra o método.

 func addStudent(student: [String: String]) { guard let name = student["name"] else { return } print("Added \(name)!") guard let rollNo = student ["rollNo"] else { print("roll No not assigned") return } print("Assigned roll no is \(rollNo).") } addStudent(student: ["name": "Ravi"]) //  "Added Ravi!" //  "roll No not assigned" addStudent(student: ["name": "Ravi", "rollNo": "1"]) //  "Added Ravi!" //  "Assigned roll no is 1" 

A vantagem do guard é uma execução mais rápida . Guard bloco Guard é executado apenas se a condição for falsa e o bloco for encerrado através de uma declaração de transferência de controle, como return , break , continue ou thrown . Isso fornece uma saída antecipada e menos colchetes. Saída antecipada significa execução mais rápida.

Consulte este artigo para obter mais informações.

Quando o guard let deve ser usado e quando o guard let ?

  • Use guard quando desejar eliminar informações inesperadas / incorretas e concentre-se na meta se tiver maneiras alternativas de lidar com as informações.
  • Use a guard if else bloqueie para reduzir o aninhamento e o recuo, pois é relativamente compacto.

O que é defer ?


A defer usada para executar um conjunto de instruções imediatamente antes da execução do código deixar o bloco atual.

A defer dentro do bloco if será executada primeiro. Isso é seguido pelo padrão LIFO para executar as demais declarações de defer .

 func doSomething() { defer { print(“1”)} defer { print(“2”)} defer { print(“3”)} if 1<2 { defer { print("1<2")} } defer { print(“4”)} defer { print(“5”)} defer { print(“6”)} }  1<2 6 5 4 3 2 1 

Listar quais operadores de transferência de controle são usados ​​no Swift?


break - A instrução break termina a execução de toda a instrução do fluxo de controle imediatamente.

continue - a instrução continue diz ao loop para parar o que está fazendo e iniciar novamente no início da próxima iteração do loop.
return - retorna valores das funções.
throw - precisa encaminhar erros usando as funções de throw
fallthrough - a instrução fallthrough usada no bloco case case para executar a instrução case, que fica ao lado das instruções case correspondentes, com base nos requisitos do usuário.

fallthrough swift o operador de fallthrough usado para executar o próximo caso, mesmo que não corresponda ao original.

 let integerToDescribe = 5 var description = “The number \(integerToDescribe) isswitch integerToDescribe { case 2, 3, 5, 7, 11, 13, 17, 19: description += “ a prime number, and also” fallthrough case 10: description += “ case 10.” default: description += “ an integer.” } print(description)// :The number 5 is a prime number, and also case 10. 

O fim da segunda parte. A primeira parte pode ser lida aqui .

Aguardamos seus comentários e lembre-se de que em poucas horas haverá um dia aberto , no âmbito do qual falaremos detalhadamente sobre nosso curso.

Source: https://habr.com/ru/post/pt452806/


All Articles