Swift - Funzioni
Una funzione è un insieme di istruzioni organizzate insieme per eseguire un'attività specifica. Una funzione di Swift 4 può essere semplice come una semplice funzione C o complessa come una funzione del linguaggio Objective C. Ci consente di passare i valori dei parametri locali e globali all'interno delle chiamate di funzione.
Function Declaration - indica al compilatore il nome di una funzione, il tipo restituito e i parametri.
Function Definition - Fornisce il corpo effettivo della funzione.
Le funzioni di Swift 4 contengono il tipo di parametro ei relativi tipi di ritorno.
Definizione di funzione
In Swift 4, una funzione è definita dalla parola chiave "func". Quando una funzione viene definita di recente, può assumere uno o più valori come "parametri" di input per la funzione ed elaborerà le funzioni nel corpo principale e restituirà i valori alle funzioni come output "tipi di ritorno".
Ogni funzione ha un nome di funzione, che descrive l'attività che la funzione esegue. Per utilizzare una funzione, è necessario "chiamare" quella funzione con il suo nome e passare i valori di input (noti come argomenti) che corrispondono ai tipi dei parametri della funzione. I parametri delle funzioni vengono anche chiamati "tuple".
Gli argomenti di una funzione devono essere sempre forniti nello stesso ordine dell'elenco dei parametri della funzione ei valori restituiti sono seguiti da →.
Sintassi
func funcname(Parameters) -> returntype {
Statement1
Statement2
---
Statement N
return parameters
}
Dai un'occhiata al seguente codice. Il nome dello studente viene dichiarato come tipo di dati stringa dichiarato all'interno della funzione "studente" e quando la funzione viene chiamata, restituirà il nome dello studente.
func student(name: String) -> String {
return name
}
print(student(name: "First Program"))
print(student(name: "About Functions"))
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
First Program
About Functions
Chiamare una funzione
Supponiamo di aver definito una funzione chiamata "display" per considerare, ad esempio, di visualizzare i numeri una funzione con nome di funzione "display" viene inizializzata per prima con l'argomento "no1" che contiene il tipo di dati intero. Quindi l'argomento "no1" viene assegnato all'argomento "a", che d'ora in poi punterà allo stesso tipo di dati intero. Ora l'argomento "a" viene restituito alla funzione. Qui la funzione display () manterrà il valore intero e restituirà i valori interi ogni volta che la funzione viene invocata.
func display(no1: Int) -> Int {
let a = no1
return a
}
print(display(no1: 100))
print(display(no1: 200))
Quando eseguiamo il programma sopra usando playground, otteniamo il seguente risultato:
100
200
Parametri e valori restituiti
Swift 4 fornisce parametri di funzione flessibili e i suoi valori di ritorno da valori semplici a valori complessi. Simile a quella di C e Objective C, le funzioni in Swift 4 possono anche assumere diverse forme.
Funzioni con parametri
Si accede a una funzione passando i valori dei suoi parametri al corpo della funzione. Possiamo passare da uno a più valori di parametro come tuple all'interno della funzione.
func mult(no1: Int, no2: Int) -> Int {
return no1*no2
}
print(mult(no1: 2, no2: 20))
print(mult(no1: 3, no2: 15))
print(mult(no1: 4, no2: 30))
Quando eseguiamo il programma sopra usando playground, otteniamo il seguente risultato:
40
45
120
Funzioni senza parametri
Potremmo anche avere funzioni senza parametri.
Sintassi
func funcname() -> datatype {
return datatype
}
Di seguito è riportato un esempio con una funzione senza un parametro:
func votersname() -> String {
return "Alice"
}
print(votersname())
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
Alice
Funzioni con valori di ritorno
Le funzioni vengono utilizzate anche per restituire valori di tipo di dati stringa, intero e float come tipi restituiti. Per scoprire il numero più grande e più piccolo in un dato array, la funzione 'ls' viene dichiarata con tipi di dati interi grandi e piccoli.
Un array viene inizializzato per contenere valori interi. Quindi l'array viene elaborato e ogni valore nell'array viene letto e confrontato per il valore precedente. Quando il valore è minore del precedente viene memorizzato nell'argomento 'small', altrimenti viene memorizzato nell'argomento 'large' ei valori vengono restituiti chiamando la funzione.
func ls(array: [Int]) -> (large: Int, small: Int) {
var lar = array[0]
var sma = array[0]
for i in array[1..<array.count] {
if i < sma {
sma = i
} else if i > lar {
lar = i
}
}
return (lar, sma)
}
let num = ls(array: [40,12,-5,78,98])
print("Largest number is: \(num.large) and smallest number is: \(num.small)")
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
Largest number is: 98 and smallest number is: -5
Funzioni senza valori di ritorno
Alcune funzioni possono avere argomenti dichiarati all'interno della funzione senza alcun valore di ritorno. Il seguente programma dichiaraa e bcome argomenti per la funzione sum (). all'interno della funzione stessa i valori per gli argomentia e b vengono passati invocando la funzione chiamata sum () ei suoi valori vengono stampati eliminando così i valori di ritorno.
func sum(a: Int, b: Int) {
let a = a + b
let b = a - b
print(a, b)
}
sum(a: 20, b: 10)
sum(a: 40, b: 10)
sum(a: 24, b: 6)
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
30 20
50 40
30 24
Funzioni con tipi restituiti opzionali
Swift 4 introduce la funzione "opzionale" per eliminare i problemi introducendo una misura di sicurezza. Considera ad esempio che stiamo dichiarando il tipo di ritorno dei valori della funzione come numero intero, ma cosa accadrà quando la funzione restituirà un valore stringa o un valore nullo. In quel caso il compilatore restituirà un valore di errore. vengono introdotti "opzionali" per eliminare questi problemi.
Le funzioni opzionali assumeranno due forme "valore" e "zero". Citeremo "Optionals" con il carattere riservato chiave "?" per verificare se la tupla restituisce un valore o un valore nullo.
func minMax(array: [Int]) -> (min: Int, max: Int)? {
if array.isEmpty { return nil }
var currentMin = array[0]
var currentMax = array[0]
for value in array[1..<array.count] {
if value < currentMin {
currentMin = value
} else if value > currentMax {
currentMax = value
}
}
return (currentMin, currentMax)
}
if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
print("min is \(bounds.min) and max is \(bounds.max)")
}
Quando eseguiamo il programma sopra utilizzando playground, otteniamo il seguente risultato:
min is -6 and max is 109
'' Optionals 'sono usati per controllare i valori' nil 'o garbage, consumando così molto tempo nel debugging e rendendo il codice efficiente e leggibile per l'utente.
Funzioni locali vs nomi di parametri esterni
Nomi dei parametri locali
I nomi dei parametri locali sono accessibili solo all'interno della funzione.
func sample(number: Int) {
print(number)
}
Qui, il funcIl numero di argomento sample è dichiarato come variabile interna poiché vi si accede internamente dalla funzione sample (). Qui il 'numero' è dichiarato come variabile locale ma il riferimento alla variabile è fatto al di fuori della funzione con la seguente dichiarazione -
func sample(number: Int) {
print(number)
}
sample(number: 1)
sample(number: 2)
sample(number: 3)
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
1
2
3
Nomi dei parametri esterni
I nomi dei parametri esterni ci consentono di nominare i parametri di una funzione per rendere più chiaro il loro scopo. Ad esempio di seguito è possibile nominare due parametri di funzione e quindi chiamare quella funzione come segue:
func pow(firstArg a: Int, secondArg b: Int) -> Int {
var res = a
for _ in 1..<b {
res = res * a
}
print(res)
return res
}
pow(firstArg:5, secondArg:3)
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
125
Parametri variadici
Quando vogliamo definire una funzione con un numero multiplo di argomenti, possiamo dichiarare i membri come parametri 'variadici'. I parametri possono essere specificati come variadici da (···) dopo il nome del parametro.
func vari<N>(members: N...){
for i in members {
print(i)
}
}
vari(members: 4,3,5)
vari(members: 4.5, 3.1, 5.6)
vari(members: "Swift 4", "Enumerations", "Closures")
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
4
3
5
4.5
3.1
5.6
Swift 4
Enumerations
Closures
Parametri costanti, variabili e I / O
Le funzioni di default considerano i parametri come 'costanti', mentre l'utente può dichiarare gli argomenti delle funzioni anche come variabili. Abbiamo già discusso che la parola chiave "let" viene utilizzata per dichiarare parametri costanti e che i parametri variabili vengono definiti con la parola chiave "var".
I parametri I / O in Swift 4 forniscono funzionalità per mantenere i valori dei parametri anche se i valori vengono modificati dopo la chiamata alla funzione. All'inizio della definizione del parametro della funzione, viene dichiarata la parola chiave 'inout' per mantenere i valori del membro.
Deriva la parola chiave 'inout' poiché i suoi valori vengono passati 'in' alla funzione e i suoi valori sono accessibili e modificati dal suo corpo della funzione e viene restituito 'out' dalla funzione per modificare l'argomento originale.
Le variabili vengono passate solo come argomento per il parametro in-out poiché i suoi valori vengono modificati solo all'interno e all'esterno della funzione. Quindi non è necessario dichiarare stringhe e valori letterali come parametri in-out. '&' prima del nome di una variabile fa riferimento al fatto che stiamo passando l'argomento al parametro in-out.
func temp(a1: inout Int, b1: inout Int) {
let t = a1
a1 = b1
b1 = t
}
var no = 2
var co = 10
temp(a1: &no, b1: &co)
print("Swapped values are \(no), \(co)")
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
Swapped values are 10, 2
Tipi di funzione e suo utilizzo
Ogni funzione segue la funzione specifica considerando i parametri di input e restituisce il risultato desiderato.
func inputs(no1: Int, no2: Int) -> Int {
return no1/no2
}
Di seguito è riportato un esempio:
func inputs(no1: Int, no2: Int) -> Int {
return no1/no2
}
print(inputs(no1: 20, no2: 10))
print(inputs(no1: 36, no2: 6))
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
2
6
Qui la funzione viene inizializzata con due argomenti no1 e no2 come tipi di dati interi e anche il suo tipo restituito viene dichiarato 'int'
Func inputstr(name: String) -> String {
return name
}
Qui la funzione è dichiarata come string tipo di dati.
Le funzioni possono anche avere void i tipi di dati e tali funzioni non restituiranno nulla.
func inputstr() {
print("Swift 4 Functions")
print("Types and its Usage")
}
inputstr()
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
Swift 4 Functions
Types and its Usage
La funzione precedente è dichiarata come una funzione void senza argomenti e senza valori di ritorno.
Utilizzo dei tipi di funzione
Le funzioni vengono prima passate con argomenti di tipo intero, float o stringa e quindi vengono passate come costanti o variabili alla funzione come indicato di seguito.
var addition: (Int, Int) -> Int = sum
Qui sum è un nome di funzione con variabili intere 'a' e 'b' che ora è dichiarato come una variabile per l'aggiunta del nome di funzione. Di seguito, sia la funzione di addizione che quella di somma hanno entrambe lo stesso numero di argomenti dichiarati come tipo di dati intero e restituiscono anche valori interi come riferimenti.
func sum(a: Int, b: Int) -> Int {
return a + b
}
var addition: (Int, Int) -> Int = sum
print("Result: \(addition(40, 89))")
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
Result: 129
Tipi di funzione come tipi di parametro e tipi restituiti
Possiamo anche passare la funzione stessa come tipi di parametro a un'altra funzione.
func sum(a: Int, b: Int) -> Int {
return a + b
}
var addition: (Int, Int) -> Int = sum
print("Result: \(addition(40, 89))")
func another(addition: (Int, Int) -> Int, a: Int, b: Int) {
print("Result: \(addition(a, b))")
}
another(sum, 10, 20)
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
Result: 129
Result: 30
Funzioni annidate
Una funzione annidata fornisce la possibilità di chiamare la funzione esterna invocando la funzione interna.
func calcDecrement(forDecrement total: Int) -> () -> Int {
var overallDecrement = 0
func decrementer() -> Int {
overallDecrement -= total
return overallDecrement
}
return decrementer
}
let decrem = calcDecrement(forDecrement: 30)
print(decrem())
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
-30