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

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

这是代码: -
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编程时从未意识到这种差异.
Swift中的函数和方法有什么区别?
我们何时使用函数?何时使用Swift中的方法?
Ric*_*cky 41
经过几个小时的阅读和实验,以下是我发现的事情: -
Swift中的函数
函数是执行特定任务的自包含代码块.您为函数指定了一个标识其功能的名称,此名称用于"调用"函数以在需要时执行其任务.
功能参数名称
但是,这些参数名称仅在函数本体中使用,并且在调用函数时不能使用.这些参数名称称为本地参数名称,因为它们仅可在函数体内使用.
这意味着默认情况下,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 在方法中为第一个参数名称提供本地参数名称,默认情况下为第二个和后续参数名称提供本地和外部参数名称.
下面的代码显示了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)
主要是名称可以互换使用,而没有人真正想要区分它们.但最终他们确实有所不同.
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..有关更多信息,请参阅:方法和函数之间的区别是什么?
嗯,@ 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 次 |
| 最近记录: |