Подтвердить что ты не робот

Каковы различия между функциями и методами в Swift?

Я всегда думал, что функции и методы одинаковы, пока я не изучил Swift через электронную книгу "Быстрый язык программирования". Я узнал, что не могу использовать greet("John", "Tuesday") для вызова функции, объявленной внутри класса, как показано в книге на экране ниже:

function declaration in swift

Я получил сообщение об ошибке " Отсутствует метка аргумента" день: "в вызове" в соответствии с этим снимком экрана:

Error message in swift

Вот код: -

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)."
    }
}

После некоторых исследований я нашел это сообщение: Разница между методом и функцией, и мне кажется, что функция, которую я объявила внутри класса, на самом деле называемый методом. Таким образом, синтаксис, который я использую для вызова метода, отличается от синтаксиса, который я использую для вызова функции.

Я никогда не осознавал эту разницу, когда я программировал в Objective-C.

  • Каковы различия между функциями и методами в Swift?

  • Когда мы используем функции и когда мы используем методы в Swift?

4b9b3361

Ответ 1

После нескольких часов чтения и экспериментов, вот что я узнал: -

Функции в Swift

Функции - это самодостаточные фрагменты кода, которые выполняют определенные задача. Вы даете функции имя, которое идентифицирует, что оно делает, и это имя используется для "вызова" функции для выполнения своей задачи, когда необходимо.

Ресурс: Официальная документация Apple по функциям в Swift

Имена функциональных параметров

Однако эти имена параметров используются только в теле самой функции и не может использоваться при вызове функции. Эти типы имен параметров называются локальными именами параметров, поскольку они доступны только для использования в теле функций.

Это означает, что по умолчанию все параметры для функции локальные параметры.

Но иногда мы хотим указать цель каждого параметра. Таким образом, мы можем фактически определить имя внешнего параметра для каждого параметра. Пример кода:

func someFunction(externalParameterName localParameterName: Int) {
    // function body goes here, and can use localParameterName
    // to refer to the argument value for that parameter
}

Другой способ сделать имя внешнего параметра - использовать символ хеширования (#), чтобы сократить имя.

func someFunction(#localParameterName: Int) {
    // function body goes here, and can use localParameterName
    // to refer to the argument value for that parameter
}

Чтобы вызвать вышеупомянутые функции с внешним параметром, вы можете использовать

someFunction(localParameterName:10)

Методы в Swift

Методы - это функции, связанные с определенным типом. Классы, структуры и перечисления могут определять методы экземпляра, которые инкапсулируют конкретные задачи и функции для работы с экземпляр заданного типа.

Ресурс: Официальная документация Apple по методам в Swift

Однако поведение локальных имен и внешних имен по умолчанию различны для функций и методов.

В частности, Swift дает имя первого параметра в методе локального имя параметра по умолчанию, а вторая и последующая имена параметров как локальные, так и внешние имена параметров по умолчанию.

В приведенном ниже коде показаны различия для параметров по умолчанию и не по умолчанию для метода в 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)."
    }
}

Я мог бы пропустить некоторые важные детали. Надеюсь, кто-то может дать лучший ответ.

Ответ 2

Как вы сами сказали, методы - это функции, но в классе. В objective-c вы никогда не понимали этого, потому что мы были только кодированием в классах. Каждая написанная нами функция - это метод класса (ViewController или какой-либо другой класс, который мы создали).

В Swift у нас есть возможность создавать функции, которые не находятся внутри какого-либо класса. Основная причина для этого - написать функции, которые не привязаны к какому-либо классу и могут использоваться везде, где они нам нужны. Поэтому, если у вас есть функция, связанная с классом, вы пишете ее внутри класса, и вы можете получить доступ к каждому экземпляру класса:

class Square {
   var length: Double
   func area() -> Double {
      return length * length
   }
}

Но если вам нужно получить доступ к функции извне, вы не будете писать ее внутри класса. Например:

func squared(number: Int) -> Int {
    return number * number
}

О синтаксических проблемах между функциями и методами: вы правильно поняли, методы и функции называются несколько иначе. Это потому, что в objective-c у нас были длинные имена методов, и нам они нравились, потому что мы могли читать, что делали эти методы, и каковы параметры. Таким образом, первый параметр в методе в большинстве случаев описывается самим именем функции. И другие параметры должны быть не только некоторыми числами или строками или экземплярами, они также должны быть описаны, поэтому Swift автоматически записывает имя переменной. Если вы хотите описать это самостоятельно, вы также можете это сделать:

class Something {
    func desc(firstString string1: String, secondString string2:String) {...}
}

Ответ 3

Главным образом, имена используются взаимозаменяемо, и люди не собираются их различать. Но в конечном итоге они имеют разницу.

someFile.swift :

func someFunc{
//some code
}

class someClass{

    func someMethod{
    //some code    
    }

}

Примечание: someClass! = SomeFile

someMethod работает только с соответствующим типом, который называется someClass. Однако этого нельзя сказать о некоторых функциях. someFunc есть только в someClass.Swift, потому что семантически он лучше подходит для записи в этот файл. Он мог быть написан в любом другом классе, если он помечен как private

И, очевидно, метод может получить доступ к self. С функциями нет self. , Подробнее см. В чем разница между методом и функцией?

Ответ 4

Ну, @Ricky ответ говорит об этом в значительной степени. Я был смущен, что именно они. Итак, вот моя мысль:

Функции могут быть определены вне классов или внутри классов /structs/enums, тогда как методы должны быть определены внутри и в части классов /structs/enums.

Мы могли бы определить функцию вне любого определения типа и использовать ее в методах любого определения типа.

Просто мое понимание и иллюстрация здесь, надеюсь, что это поможет кому-то другому или вы можете отредактировать, если вы чувствуете, что есть необходимое улучшение ИЛИ дайте мне знать, если что-то не так:

//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)

Ответ 5

Вот простой ответ о разнице между функциями и методами:

Некоторые люди используют "функцию" и "метод" взаимозаменяемо, но есть небольшая разница: оба они являются кусками кода многократного использования, но методы принадлежат классам, структурам и перечислениям, а функции - нет.

Так:

func thisIsAFunction() {
}

struct Person {
    func thisIsAMethod() {
    }
}

Поскольку методы всегда принадлежат к типу данных, у них есть понятие о себе, которого нет у функций.

источник: https://www.hackingwithswift.com/example-code/language/whats-the-difference-between-a-function-and-a-method