Mark Tornej
Mark Tornej

Reputation: 175

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

For example, I have func test(paramA: String){}.

Sometimes I want to pass a string as argument but other times, I definitely don't want to have an argument at all, but rather: test()

Is it possible to call both test() and test("hello") or does it need to be different functions?

Also I'm not sure if this is called something in particular. SO defined optional parameters as:

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.

To me, using Swift, optional means using ? in reference to it perhaps being nil.

EDIT Thanks for the response. It's evident that I should use default parameters. However, doing so in a closure result in the following error:

"Default argument not permitted in a tuple type"

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

Here comes the full function if that's helpful:

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

Upvotes: 0

Views: 670

Answers (2)

Rajender Kumar
Rajender Kumar

Reputation: 1377

  1. First you have to be clear with your requirements.
  2. You should not use methods which are directly dependent on instance variables, as setting there values will be a problem according to your unit test cases.

As per my understanding this is the correct approach you can define the method with parameter having default value. So that you can call that method as per your requirements with or without the parameter.

Upvotes: 0

Alexander
Alexander

Reputation: 63157

You (everyone, really) would really benefit from reading the Swift book, cover to cover.

What you're looking for is called a default value.

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

or

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

The former is simpler, but more limited. For example, you can't distinguish rather the default value "Your default value here" was used, or whether the caller passed in their own value, which happens to be "Your default value here"). In my experience, the distinction is seldom required, but it's good to call out just in case.

In the latter case, you have the flexibility to handle the optional in many more ways. You could substitute a default value with ??, do conditional binding, map it, etc.

Upvotes: 2

Related Questions