【问题标题】:Swift: difference between function callingSwift:函数调用之间的区别
【发布时间】:2016-02-03 06:11:57
【问题描述】:

我是 Swift 编程的新手。我无法理解以下代码。在下面的代码中调用

  1. incrementBy 方法:我必须在第二个参数中输入 numberOfTimes。但是,
  2. sampleFunc 方法:我不必在第二个参数中输入 lastName

    class Counter {
    var count: Int = 0
    func incrementBy(amount: Int, numberOfTimes : Int) {
        count += amount * numberOfTimes
    }
    }
    
    var counter = Counter()
    counter.incrementBy(1, numberOfTimes : 3)
    print(counter.count)
    
    func sampleFunc(firstName : String, lastName : String){
    print("Hello \(firstName) \(lastName)")
    }
    
    sampleFunc("Abel", "Rosnoski")
    

为什么会有细微差别?请解释一下。

【问题讨论】:

  • 您希望 sampleFunc 中的 lastName 作为可选值,对吧?
  • 不,我认为他是在问什么时候必须使用“命名参数”,以及什么时候可以通过只给出值来解决没有命名参数的问题。对吗@umangKothari?
  • 像这样sampleFunc("Abel", "Rosnoski")这样编译时,它会给出错误为“Missed argument lastName”所以,你需要像这样使用你的第二个参数名称sampleFunc("Abel", lastName: "Rosnoski")

标签: ios iphone swift


【解决方案1】:

封装在类(或结构体或枚举)中时,方法的第一个参数名称不包含在外部,而后面的所有参数名称都包含在外部。不包含在外部的参数,调用方法时不必为它们命名。但是对于外部包含的,您必须这样做。

您的方法incrementBy(amount: Int, numberOfTimes : Int) 被封装在您的类中,这就是为什么第二个参数会自动包含在外部。这意味着您必须在为参数提供值之前输入numberOfTimes。这就是为什么你必须这样称呼它:

counter.incrementBy(1, numberOfTimes : 3)

您的第二个方法func sampleFunc(firstName : String, lastName : String) 未包含在您的课程中。这就是您不必为其参数提供名称的原因。这就是为什么你可以这样称呼它:

sampleFunc("Abel", "Rosnoski")

您可以阅读更多详细信息here

编辑:正如 User3441734 善意地指出(我引用)“有一个例外。带有参数的 init 总是需要命名参数,如果外部名称未指定为 _ ”。您可以在此处阅读有关Customizing initialization 的更多信息。

【讨论】:

  • 有一个例外。如果外部名称未指定为 _,则带参数的 init 始终需要命名参数
【解决方案2】:

@NSNoob 做了一个很好的解释,我只是添加了一些例子来理解函数调用的威力:

func sampleFunc(firstName : String, lastName : String) {}
sampleFunc("First", lastName: "Last")

您可以像这样删除命名第二个参数:

func sampleFunc(firstName : String, _ lastName : String) {}
sampleFunc("First", "Last")

如果要为所有参数添加命名:

func sampleFunc(firstName firstName : String, lastName : String) {}
sampleFunc(firstName: "First", lastName: "Last")

如果要为参数设置默认值:

func sampleFunc(firstName firstName : String, lastName : String = "Last") {}
sampleFunc(firstName: "First")

希望有帮助

【讨论】:

  • 这并不是在远程解释外部包含参数的概念或包含在类中的方法的效果。您只是假设该方法在类之外。
  • 是的,我已经写过了,你解释得很好。没有必要将一件事写两次。我只是添加了一些价值信息
  • 我还想指出,在签名func sampleFunc(firstName firstName : String, lastName : String) 中,外部和内部参数名称firstName 是相同的,因此您不必输入两次。只需在它前面加上一个#。像这样的东西:func sampleFunc(#firstName : String, lastName : String)
  • # 已从 Swift 中移除。它不能在 Swift 2.1 中编译
【解决方案3】:
func a(param1:Double, param2:Double) -> Double {
    return param1*param2;
}

func a2(p1 param1:Double,p2 param2:Double) -> Double {
    return param1*param2;
}

据我了解并在操场上进行了一些试验,如果您不定义参数标签,则必须使用参数名称。

var c = a(3.2,2.3)
c //gives error

var b = a(param1:3.2,param2:2.3);
b

var d = a2(p1:3.2,p2:2.3);
d

var e = a2(param1:3.2,param2:2.3)
e //gives error

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 2023-03-12
    • 2020-08-16
    • 2021-08-21
    相关资源
    最近更新 更多