function - función - ¿Cuáles son las diferencias entre funciones y métodos en Swift?
función en swift (4)
Bueno, la respuesta de @ Ricky lo dice más o menos. Estaba confundido qué son exactamente. Así que aquí está mi pensamiento:
Las funciones se pueden definir fuera de las clases o dentro de las clases / estructuras / enumeraciones, mientras que los métodos deben definirse dentro de y dentro de las clases / estructuras / enumeraciones.
Podríamos definir una función fuera de cualquier definición de tipo y podríamos usarla dentro de los métodos de cualquier definición de tipo.
Solo mi comprensión e ilustración aquí, espero que esto ayude a otra persona o usted puede editar si siente que se necesita una mejora O hágame saber si algo está mal:
//This is a Function which prints a greeting message based on the category defined in an ''enum''
func greet(yourName name: String, category: GreetingsCategory) {
switch category {
case .Person:
print("Hello, " + name + " Today is Tuesday")
case .Vehicle:
print("Hello, " + name + " your Vehicle is a Car")
}
}
//This is an ''enum'' for greetings categories
enum GreetingsCategory: String {
case Person
case Vehicle
}
//Type: Person
class Person {
//This is a method which acts only on Person type
func personGreeting() {
greet(yourName: "Santosh", category: .Person)
}
}
//Type: Vehicle
class Vehicle {
//This is a method which acts only on Vehicle type
func vehicleGreeting() {
greet(yourName: "Santosh", category: .Vehicle)
}
}
//Now making use of our Function defined above by calling methods of defferent types.
let aPerson = Person()
aPerson.personGreeting()
//prints : Hello, Santosh Today is Tuesday
let aVehicle = Vehicle()
aVehicle.vehicleGreeting()
//prints: Hello, Santosh your Vehicle is a Car
//We can also call the above function directly
greet(yourName: "Santosh", category: .Person)
Siempre pensé que las funciones y los métodos eran los mismos, hasta que aprendí Swift a través del libro electrónico "Swift Programming Language". Descubrí que no puedo usar greet("John", "Tuesday")
para llamar a una función que declare dentro de una clase, como se muestra en el eBook en la captura de pantalla siguiente:
Recibí un mensaje de error que decía " Falta la etiqueta del argumento ''día:'' en la llamada " de acuerdo con esta captura de pantalla:
Aquí está el código:
import Foundation
import UIKit
class ViewController2: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//var dailyStatement = greet("John", "Tuesday")
var dailyStatement = greet("John", day: "Tuesday")
println(dailyStatement)
}
func greet(name: String, day: String) -> String {
return "Hello /(name), today is /(day)."
}
}
Después de algunas investigaciones, encontré esta publicación: Diferencia entre un método y una función , y me parece que la función que declaro dentro de una clase en realidad se llama método. Entonces, la sintaxis que utilizo para llamar al método es diferente en comparación con la sintaxis que utilizo para llamar a una función.
Nunca me di cuenta de esta diferencia cuando estaba programando en Objective-C.
¿Cuáles son las diferencias entre funciones y métodos en Swift?
¿Cuándo utilizamos las funciones y cuándo usamos los métodos en Swift?
Como dijiste a ti mismo, los métodos son funciones, pero en una clase. En Object-c nunca te diste cuenta de esto, porque solo codificamos en clases. Cada función que escribimos era un método de una clase (ViewController o alguna otra clase que creamos).
En Swift tenemos la capacidad de crear funciones que no están dentro de alguna clase. La razón principal para hacer esto es escribir funciones que no están vinculadas a ninguna clase, y pueden usarse donde sea que las necesitemos. Entonces, si tienes una función que está relacionada con una clase, la escribes dentro de la clase y puedes acceder desde cada instancia de la clase:
class Square {
var length: Double
func area() -> Double {
return length * length
}
}
Pero si necesita acceder a la función desde cualquier lugar, entonces no la escriba dentro de una clase. Por ejemplo:
func squared(number: Int) -> Int {
return number * number
}
Acerca de sus problemas de sintaxis entre funciones y métodos: lo ha adivinado bien, los métodos y las funciones se llaman un poco diferente. Eso es porque en Objective-C teníamos nombres de método largos y nos gustaban porque podíamos leer lo que los métodos estaban haciendo y para qué eran los parámetros. Entonces, el primer parámetro en un método es en la mayoría de los casos descrito por el nombre de la función en sí. Y los otros parámetros no solo deben ser algunos números o cadenas o instancias, también deben describirse, por lo que Swift escribe el nombre de la variable automáticamente. Si quiere describirlo usted mismo, puede hacerlo también:
class Something {
func desc(firstString string1: String, secondString string2:String) {...}
}
Después de unas horas de lectura y experimentación, he aquí las cosas que descubrí:
Funciones en Swift
Las funciones son trozos de código independientes que realizan una tarea específica. Le asigna a una función un nombre que identifica lo que hace, y este nombre se usa para "llamar" a la función para realizar su tarea cuando sea necesario.
Recurso : documentación oficial de Apple sobre las funciones en Swift
Nombres de parámetros de funciones
Sin embargo, estos nombres de parámetros solo se utilizan dentro del cuerpo de la función en sí, y no se pueden usar al llamar a la función. Estos tipos de nombres de parámetros se conocen como nombres de parámetros locales, porque solo están disponibles para su uso dentro del cuerpo de la función.
Significa que, por defecto, todos los parámetros para la Función son parámetros locales .
Pero, a veces queremos indicar el propósito de cada parámetro. Entonces, podemos definir un nombre de parámetro externo para cada parámetro. Código de ejemplo:
func someFunction(externalParameterName localParameterName: Int) {
// function body goes here, and can use localParameterName
// to refer to the argument value for that parameter
}
Otra forma de hacer que el nombre del parámetro externo sea usando el símbolo hash (#) para acortar el nombre.
func someFunction(#localParameterName: Int) {
// function body goes here, and can use localParameterName
// to refer to the argument value for that parameter
}
Para llamar a las funciones anteriores con un parámetro externo, puede usar
someFunction(localParameterName:10)
Métodos en Swift
Los métodos son funciones que están asociadas con un tipo particular. Las clases, estructuras y enumeraciones pueden definir métodos de instancia, que encapsulan tareas y funcionalidades específicas para trabajar con una instancia de un tipo determinado.
Recurso : documentación oficial de Apple sobre métodos en Swift
Sin embargo, el comportamiento predeterminado de los nombres locales y los nombres externos es diferente para las funciones y métodos.
Específicamente, Swift da el nombre del primer parámetro en un método, un nombre de parámetro local de manera predeterminada , y le da a los nombres de los parámetros segundo y subsiguientes nombres de parámetros tanto locales como externos por defecto.
El siguiente código muestra las diferencias para los parámetros predeterminados y no predeterminados para el método en Swift.
import Foundation
import UIKit
class ViewController2: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//Default methods calling
var dailyStatement = greet("Rick", day: "Tuesday")
println(dailyStatement)
//First parameter is also an external parameter
var dailyStatement2 = greet2(name:"John", day: "Sunday")
println(dailyStatement2)
}
//Default: First Parameter is the local parameter, the rest are external parameters
func greet (name: String, day: String) -> String {
return "Hello /(name), today is /(day)."
}
//Use Hash symbol to make the First parameter as external parameter
func greet2 (#name: String, day: String) -> String {
return "Hello /(name), today is /(day)."
}
}
Es posible que me pierda algunos detalles importantes. Espero que alguien pueda dar una mejor respuesta.
someFile.swift
:
func someFunc{
//some code
}
class someClass{
func someMethod{
//some code
}
}
Nota: someClass! = SomeFile
someMethod funciona solo en su tipo asociado que es ''someClass''. Sin embargo, no se puede decir lo mismo de algunos Func. someFunc solo está en someClass.Swift porque, semánticamente , es más adecuado escribirlo en ese archivo. Podría haber sido escrito en cualquier otra clase, siempre que esté marcado con