是否有可能没有用作参数的参数?

时间:2019-09-08 18:16:15

标签: swift parameters arguments optional-parameters

例如,我有func test(paramA: String){}

有时候我想传递一个string作为参数,但是有时候,我绝对不想再有一个参数,而是:test()

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

我也不知道这是否特别被称为。 SO将可选参数定义为:

  

可选参数是调用者可以在对函数或方法的调用中包括但不必包含的参数。如果省略,则使用默认值。在大多数情况下使用默认值时,可选参数很有用,但有时仍需要指定。

对我来说,使用Swift是可选的,使用?来表示它可能是nil

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

  

“元组类型中不允许使用默认参数”

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

2 个答案:

答案 0 :(得分: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,依此类推。

答案 1 :(得分:0)

  1. 首先,您必须清楚自己的要求。
  2. 您不应使用直接依赖于实例变量的方法,因为根据单元测试用例,在那里设置值将是一个问题。

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