协议方法/函数中的Swift默认参数和ignore参数

Kal*_*zem 5 arguments protocols ios swift

如何设置协议的功能,以便它可以接收可选参数甚至忽略它?

我有这个协议:

protocol Game {
    func modeName(forRound: Int) -> ModeName
}
Run Code Online (Sandbox Code Playgroud)

有了这两个特殊课程:

//Goal: Default forRound should be 0 if none provided
class OnlineGame : Game {
    func modeName(forRound: Int = 0) -> ModeName {
        //Some code
    }
}

//Goal: I don't care about the forRound value here
class OfflineGame : Game {
    func modeName(_ forRound: Int) -> ModeName {
        //Some code
    }
}
Run Code Online (Sandbox Code Playgroud)

rin*_*aro 1

首先,在 中protocol,你声明的是“method”,并且“method”的第一个参数默认没有外部名称。所以这是非常正常的情况代码:

class SomeGame: Game {
    func modeName(forRound: Int) -> ModeName {
        // ...
    }
}

let game: Game = SomeGame()
let modeName = game.modeName(1) // not `game.modeName(forRound: 1)`
Run Code Online (Sandbox Code Playgroud)

在您的OnlineGame情况下,如果参数具有默认值,即使它是方法的第一个参数,它也会自动具有外部名称。_您可以使用显式外部名称覆盖该行为:

class OnlineGame : Game {
    func modeName(_ forRound: Int = 0) -> ModeName {
        //Some code
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可以忽略具有内部名称的OfflineGame参数:_

class OfflineGame : Game {
    func modeName(_: Int) -> ModeName {
        //Some code
    }
}
Run Code Online (Sandbox Code Playgroud)