是否可以使用不用作参数的参数?
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)
}
}
}
- 首先你要明确自己的需求。
- 您不应使用直接依赖于实例变量的方法,因为根据您的单元测试用例,设置那里的值将是一个问题。
根据我的理解,这是您可以使用具有默认值的参数定义方法的正确方法。
这样您就可以根据需要使用或不使用参数来调用该方法。
你(每个人,真的)会真的从阅读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
等
比如我有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)
}
}
}
- 首先你要明确自己的需求。
- 您不应使用直接依赖于实例变量的方法,因为根据您的单元测试用例,设置那里的值将是一个问题。
根据我的理解,这是您可以使用具有默认值的参数定义方法的正确方法。 这样您就可以根据需要使用或不使用参数来调用该方法。
你(每个人,真的)会真的从阅读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
等