Swift - Funciones
Una función es un conjunto de declaraciones organizadas juntas para realizar una tarea específica. Una función Swift 4 puede ser tan simple como una función C simple o tan compleja como una función del lenguaje Objective C. Nos permite pasar valores de parámetros locales y globales dentro de las llamadas a funciones.
Function Declaration - le dice al compilador sobre el nombre de una función, el tipo de retorno y los parámetros.
Function Definition - Proporciona el cuerpo real de la función.
Las funciones de Swift 4 contienen el tipo de parámetro y sus tipos de retorno.
Definición de función
En Swift 4, una función se define mediante la palabra clave "func". Cuando una función se define nuevamente, puede tomar uno o varios valores como 'parámetros' de entrada para la función y procesará las funciones en el cuerpo principal y devolverá los valores a las funciones como 'tipos de retorno' de salida.
Cada función tiene un nombre de función, que describe la tarea que realiza la función. Para usar una función, "llama" a esa función con su nombre y pasa valores de entrada (conocidos como argumentos) que coinciden con los tipos de parámetros de la función. Los parámetros de función también se denominan "tuplas".
Los argumentos de una función siempre deben proporcionarse en el mismo orden que la lista de parámetros de la función y los valores de retorno van seguidos de →.
Sintaxis
func funcname(Parameters) -> returntype {
Statement1
Statement2
---
Statement N
return parameters
}
Eche un vistazo al siguiente código. El nombre del estudiante se declara como un tipo de datos de cadena declarado dentro de la función 'estudiante' y cuando se llama a la función, devolverá el nombre del estudiante.
func student(name: String) -> String {
return name
}
print(student(name: "First Program"))
print(student(name: "About Functions"))
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
First Program
About Functions
Llamar a una función
Supongamos que definimos una función llamada 'pantalla' para considerar, por ejemplo, para mostrar los números, una función con el nombre de función 'pantalla' se inicializa primero con el argumento 'no1' que contiene el tipo de datos enteros. Luego, el argumento 'no1' se asigna al argumento 'a' que, en adelante, apuntará al mismo tipo de datos entero. Ahora el argumento 'a' se devuelve a la función. Aquí la función display () mantendrá el valor entero y devolverá los valores enteros cada vez que se invoca la función.
func display(no1: Int) -> Int {
let a = no1
return a
}
print(display(no1: 100))
print(display(no1: 200))
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
100
200
Parámetros y valores devueltos
Swift 4 proporciona parámetros de función flexibles y sus valores de retorno de valores simples a complejos. Similar a las de C y Objective C, las funciones en Swift 4 también pueden tomar varias formas.
Funciones con parámetros
Se accede a una función pasando los valores de sus parámetros al cuerpo de la función. Podemos pasar valores de parámetros individuales a múltiples como tuplas dentro de la función.
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))
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
40
45
120
Funciones sin parámetros
También podemos tener funciones sin ningún parámetro.
Sintaxis
func funcname() -> datatype {
return datatype
}
A continuación se muestra un ejemplo que tiene una función sin un parámetro:
func votersname() -> String {
return "Alice"
}
print(votersname())
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
Alice
Funciones con valores devueltos
Las funciones también se utilizan para devolver valores de tipo de datos de cadena, enteros y flotantes como tipos de retorno. Para averiguar el número más grande y más pequeño en una matriz dada, la función 'ls' se declara con tipos de datos enteros grandes y pequeños.
Una matriz se inicializa para contener valores enteros. Luego, la matriz se procesa y todos y cada uno de los valores de la matriz se leen y comparan con su valor anterior. Cuando el valor es menor que el anterior, se almacena en el argumento 'pequeño', de lo contrario, se almacena en el argumento 'grande' y los valores se devuelven llamando a la función.
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)")
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
Largest number is: 98 and smallest number is: -5
Funciones sin valores de retorno
Algunas funciones pueden tener argumentos declarados dentro de la función sin ningún valor de retorno. El siguiente programa declaraa y bcomo argumentos de la función sum (). dentro de la función misma los valores de los argumentosa y b se pasan invocando la función sum () y sus valores se imprimen eliminando así los valores de retorno.
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)
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
30 20
50 40
30 24
Funciones con tipos de devolución opcionales
Swift 4 presenta una función 'opcional' para eliminar los problemas mediante la introducción de una medida de seguridad. Considere, por ejemplo, que estamos declarando el tipo de retorno de valores de función como entero, pero qué sucederá cuando la función devuelva un valor de cadena o un valor nulo. En ese caso, el compilador devolverá un valor de error. Se introducen 'opcionales' para eliminar estos problemas.
Las funciones opcionales tomarán dos formas, 'valor' y 'nulo'. Mencionaremos 'Opcionales' con el carácter de clave reservada '?' para comprobar si la tupla devuelve un valor o un valor nulo.
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)")
}
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
min is -6 and max is 109
Los '' opcionales '' se utilizan para verificar valores 'nulos' o basura, lo que consume mucho tiempo en la depuración y hace que el código sea eficiente y legible para el usuario.
Funciones Nombres de parámetros locales versus externos
Nombres de parámetros locales
Se accede a los nombres de los parámetros locales solo dentro de la función.
func sample(number: Int) {
print(number)
}
Aquí el funcEl número de argumento de muestra se declara como variable interna ya que la función sample () accede a él internamente. Aquí el 'número' se declara como variable local, pero la referencia a la variable se hace fuera de la función con la siguiente declaración:
func sample(number: Int) {
print(number)
}
sample(number: 1)
sample(number: 2)
sample(number: 3)
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
1
2
3
Nombres de parámetros externos
Los nombres de parámetros externos nos permiten nombrar parámetros de una función para que su propósito sea más claro. Por ejemplo, a continuación, puede nombrar dos parámetros de función y luego llamar a esa función de la siguiente manera:
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)
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
125
Parámetros Variadic
Cuando queremos definir una función con varios argumentos, podemos declarar los miembros como parámetros 'variadic'. Los parámetros se pueden especificar como variables mediante (···) después del nombre del parámetro.
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")
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
4
3
5
4.5
3.1
5.6
Swift 4
Enumerations
Closures
Parámetros constantes, variables y de E / S
Las funciones por defecto consideran los parámetros como 'constantes', mientras que el usuario puede declarar los argumentos de las funciones también como variables. Ya discutimos que la palabra clave 'let' se usa para declarar parámetros constantes y los parámetros variables se definen con la palabra clave 'var'.
Los parámetros de E / S en Swift 4 proporcionan funcionalidad para retener los valores de los parámetros aunque sus valores se modifiquen después de la llamada a la función. Al comienzo de la definición del parámetro de función, se declara la palabra clave 'inout' para retener los valores de los miembros.
Deriva la palabra clave 'inout' ya que sus valores se pasan 'in' a la función y el cuerpo de la función accede y modifica sus valores y se devuelve 'out' de la función para modificar el argumento original.
Las variables solo se pasan como un argumento para el parámetro in-out, ya que solo sus valores se modifican dentro y fuera de la función. Por lo tanto, no es necesario declarar cadenas y literales como parámetros de entrada y salida. '&' antes de un nombre de variable hace referencia a que estamos pasando el argumento al parámetro 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)")
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
Swapped values are 10, 2
Tipos de funciones y su uso
Todas y cada una de las funciones siguen la función específica considerando los parámetros de entrada y generan el resultado deseado.
func inputs(no1: Int, no2: Int) -> Int {
return no1/no2
}
A continuación se muestra un ejemplo:
func inputs(no1: Int, no2: Int) -> Int {
return no1/no2
}
print(inputs(no1: 20, no2: 10))
print(inputs(no1: 36, no2: 6))
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
2
6
Aquí la función se inicializa con dos argumentos no1 y no2 como tipos de datos enteros y su tipo de retorno también se declara como 'int'
Func inputstr(name: String) -> String {
return name
}
Aquí la función se declara como string tipo de datos.
Las funciones también pueden tener void los tipos de datos y esas funciones no devolverán nada.
func inputstr() {
print("Swift 4 Functions")
print("Types and its Usage")
}
inputstr()
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
Swift 4 Functions
Types and its Usage
La función anterior se declara como una función nula sin argumentos ni valores de retorno.
Uso de tipos de funciones
Las funciones se pasan primero con argumentos de tipo entero, flotante o de cadena y luego se pasan como constantes o variables a la función como se menciona a continuación.
var addition: (Int, Int) -> Int = sum
Aquí sum es un nombre de función que tiene variables enteras 'a' y 'b' que ahora se declara como una variable para la adición del nombre de la función. De ahora en adelante, tanto la función de suma como la función de suma tienen el mismo número de argumentos declarados como tipo de datos entero y también devuelven valores enteros como referencias.
func sum(a: Int, b: Int) -> Int {
return a + b
}
var addition: (Int, Int) -> Int = sum
print("Result: \(addition(40, 89))")
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
Result: 129
Tipos de funciones como tipos de parámetros y tipos de retorno
También podemos pasar la función en sí como tipos de parámetros a otra función.
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)
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
Result: 129
Result: 30
Funciones anidadas
Una función anidada proporciona la posibilidad de llamar a la función externa invocando la función 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())
Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:
-30