是否可以使用不用作参数的参数?

Is it possible to have parameters that aren't used as arguments?

比如我有func test(paramA: String){}.

有时我想传递一个 string 作为参数,但其他时候,我根本不想有一个参数,而是:test()

是否可以同时调用 test()test("hello") 还是需要不同的函数?

另外我也不确定这是不是有什么特别的称呼。 SO 将可选参数定义为:

An optional parameter is one that a caller can include in a call to a function or method, but doesn't have to. When omitted, a default value is used instead. Optional parameters are useful when the default value is used in most cases, but still needs to be specified on occasion.

对我来说,使用 Swift,可选意味着使用 ? 来引用它可能是 nil

编辑 感谢您的回复。很明显我应该使用默认参数。但是,在 closure 中这样做会导致以下错误:

"Default argument not permitted in a tuple type"

func characterIsMoving(i: Int, j: Int, completion: @escaping(_ moveWasWithinLimit: Bool, _ test: Bool = false ) -> Void) { ... }

如果有帮助的话,这里是完整的功能:

func characterIsMoving(i: Int, j: Int, completion: @escaping(_ moveWasWithinLimit: Bool, _ test: Bool = false ) -> Void) {
    if !gameBoardArray[i][j].isAccessibilityElement {
        print("Not Accessible")
        currentSelectedTile = character.getCurrentPosition()

        return
    }else {
        print("Moving")
        var moveWasWithinLimit: Bool

        if(characterMoveLimit.contains(currentSelectedTile)){
            print("Within Limit")
            previousSelectedTile.fillColor = SKColor.gray
            currentSelectedTile.fillColor = SKColor.brown
            placeCharacter(row: i, col: j)
            buttonIsAvailable = false

            for moveRadius in characterMoveLimit {
                moveRadius.fillColor = SKColor.gray
            }
            characterMoveLimit.removeAll()
            moveLimit(limitWho: "CHARACTER", characterOrEnemy: character, i: i, j: j)

            moveWasWithinLimit = true
            completion(moveWasWithinLimit)
        }else{
            print("Outside Move Limit")
            currentSelectedTile = previousSelectedTile
            moveWasWithinLimit = false
            completion(moveWasWithinLimit)
        }
    }
}
  1. 首先你要明确自己的需求。
  2. 您不应使用直接依赖于实例变量的方法,因为根据您的单元测试用例,设置那里的值将是一个问题。

根据我的理解,这是您可以使用具有默认值的参数定义方法的正确方法。 这样您就可以根据需要使用或不使用参数来调用该方法。

你(每个人,真的)会真的从阅读the Swift book中获益,从头到尾。

您要查找的称为默认值。

func test(paramA: String = "Your default value here") {}

func test(paramA: String? = nil) {}

前者更简单,但限制更多。例如,您无法区分使用的是默认值 "Your default value here",还是调用者是否传入了他们自己的值,恰好是 "Your default value here")。根据我的经验,很少需要区分,但为了以防万一还是很好。

在后一种情况下,您可以灵活地以更多方式处理可选。您可以用 ?? 替换默认值,进行条件绑定,map