Swift中的函数和方法有什么区别?

Ric*_*cky 46 methods function swift

我一直认为函数和方法是一样的,直到我通过"Swift编程语言"电子书学习Swift.我发现我不能greet("John", "Tuesday")用来调用我在类中声明的函数,如下面屏幕截图中的电子书所示:

swift中的函数声明

我收到一条错误,说"根据此屏幕截图,错过了参数标签'日:'正在通话中 ":

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)."
    }
}
Run Code Online (Sandbox Code Playgroud)

经过一些研究,我发现了这篇文章:方法和函数之间的区别,在我看来,我在类中声明的函数实际上被称为方法.因此,与用于调用函数的语法相比,我用于调用方法的语法是不同的.

我在Objective-C编程时从未意识到这种差异.

  1. Swift中的函数和方法有什么区别?

  2. 我们何时使用函数?何时使用Swift中的方法?

Ric*_*cky 41

经过几个小时的阅读和实验,以下是我发现的事情: -

Swift中的函数

函数是执行特定任务的自包含代码块.您为函数指定了一个标识其功能的名称,此名称用于"调用"函数以在需要时执行其任务.

资源:有关Swift功能的官方Apple文档

功能参数名称

但是,这些参数名称仅在函数本体中使用,并且在调用函数时不能使用.这些参数名称称为本地参数名称,因为它们仅可在函数体内使用.

这意味着默认情况下,Function的所有参数都是本地参数.

但是,有时我们想要指出每个参数的目的.因此,我们实际上可以为每个参数定义外部参数名称.示例代码:

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

制作外部参数名称的另一种方法是使用哈希符号(#)来缩短名称.

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

要使用外部参数调用上述函数,您可以使用

someFunction(localParameterName:10)
Run Code Online (Sandbox Code Playgroud)

Swift中的方法

方法是与特定类型相关联的函数.类,结构和枚举都可以定义实例方法,这些方法封装了用于处理给定类型的实例的特定任务和功能.

资源:关于Swift中方法的官方Apple文档

但是,本地名称和外部名称的默认行为对于函数和方法是不同的.

具体来说,默认情况下,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)."
    }
}
Run Code Online (Sandbox Code Playgroud)

我可能会错过一些重要细节.希望有人能提供更好的答案.


Ben*_*Ben 26

正如你自己所说,方法是函数,但在类中.在objective-c中你从未意识到这一点,因为我们只是在课堂上编写代码.我们编写的每个函数都是一个类的方法(ViewController或我们创建的其他类).

在Swift中,我们能够创建不在某个类中的函数.这样做的主要原因是编写与任何类无关的函数,并且可以在我们需要的任何地方使用.因此,如果您有一个与类相关的函数,那么您可以在类中编写它,并且可以从该类的每个实例访问:

class Square {
   var length: Double
   func area() -> Double {
      return length * length
   }
}
Run Code Online (Sandbox Code Playgroud)

但是如果你需要从任何地方访问该函数,那么你不要在类中编写它.例如:

func squared(number: Int) -> Int {
    return number * number
}
Run Code Online (Sandbox Code Playgroud)

关于函数和方法之间的语法问题:你猜对了,方法和函数的调用有点不同.这是因为在Objective-C中我们有很长的方法名称,我们喜欢它们,因为我们可以读取方法正在做什么以及参数是什么.因此,方法中的第一个参数在大多数情况下由函数名称本身描述.其他参数不仅应该是一些数字或字符串或实例,它们也应该被描述,因此Swift会自动写出变量的名称.如果你想自己描述它,你也可以这样做:

class Something {
    func desc(firstString string1: String, secondString string2:String) {...}
}
Run Code Online (Sandbox Code Playgroud)

  • 你是对的.但是在iOS开发中使用的实际逻辑是在99.999%的类中编写的;) (4认同)
  • "......在目标c中你从未意识到这一点,因为我们只是在课堂上编码".实际上,Objective-C是C的严格超集,即使在.m文件中也很可能(并且很有用)具有"自由"功能.有时您需要定义一个与任何类无关的进程. (3认同)

Hon*_*ney 9

主要是名称可以互换使用,而没有人真正想要区分它们.但最终他们确实有所不同.

someFile.swift:

func someFunc{
//some code
}

class someClass{

    func someMethod{
    //some code    
    }

}
Run Code Online (Sandbox Code Playgroud)

注意: someClass!= someFile

someMethod只适用于'someClass'的关联类型.然而,someFunc也不能说同样的事情.someFunc仅在someClass.Swift中,因为在语义上它更适合在该文件中编写.它可以写在任何其他类中,只要它标记为private

显然该方法可以访问self.有了功能,没有self..有关更多信息,请参阅:方法和函数之间的区别是什么?


San*_*osh 9

嗯,@ Ricky的回答说得非常好.我很困惑他们到底是什么.所以这是我的想法:

函数可以在类之外或类/结构/枚举内定义,而方法必须在类/结构/枚举的内部和部分定义.

我们可以在任何Type的定义之外定义一个Function,并且可以在任何Type定义的Methods中使用它.

只是我的理解和插图,希望这可以帮助别人或你可以编辑,如果你觉得有需要改进或让我知道是否有任何错误:

//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)
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

18992 次

最近记录:

7 年,3 月 前