假设我有这样一个函数:
func myFunc(myObject: MyObjectA){}
但是如果我想让 myObject
变成 MyObjectB
或 MyObjectC
怎么办?有没有一种方法可以为一个和相同的参数提供多个可能的参数替代方案?
注意:我不想要额外的参数,我希望同一个参数能够接受许多不同的类。像这样:
func myFunc(myObject: MyObjectA || MyObjectB){}
如果您想使用我的真实代码获得更详细的方法:我有一个战斗函数
,当前角色可以在其中攻击敌人。我希望能够在敌人攻击角色时使用相同的功能。
func combat(character: Character, enemy: Enemy, completion: @escaping() -> Void) {
let randomNumber = Int(arc4random_uniform(101))
print(String(character.characterAttack - enemy.enemyDefence), "% chance to hit.")
if(randomNumber <= (character.characterAttack - enemy.enemyDefence)) {
enemy.enemyHealth = (enemy.enemyHealth - character.characterDamage)
print("HIT", randomNumber, "% ", String(enemy.enemyHealth))
}else{
print("MISS", randomNumber)
}
if(enemy.enemyHealth > 0) {
print("Enemy has ", String(enemy.enemyHealth), " health left")
}else{
print("Enemy Destroyed")
completion()
}
}
因此,我希望它不是 character: Character, enemy: Enemy
作为参数,而是 attacker: CharacterOrEnemy, defender: EnemyOrCharacter
并相应地更改函数的其余部分.
最佳答案
不幸的是,您无法以您想要的方式获得您正在寻求的行为。
您可以采用以下解决方案之一:
- 创建具有不同函数签名的多个函数
- 使
MyObjectA
、MyObjectB
等符合相同的协议(protocol)或子类化为相同的类 - 泛型
方法 1(多功能)详细信息
func myFunc(myObject: MyObjectA){
}
func myFunc(myObject: MyObjectB){
}
方法 2(协议(protocol))详细信息:
protocol SomethingProtocol {
}
class MyObjectA: SomethingProtocol {
}
class MyObjectB: SomethingProtocol {
}
func myFunc(myObject: SomethingProtocol){
}
方法 2(子类化)详细信息:
class SomeClass {
}
class MyObjectA: SomeClass {
}
class MyObjectB: SomeClass {
}
func myFunc(myObject: SomeClass){
}
方法 3(泛型)详细信息:
func myFunc<T>(myObject: T){
}
正确的解决方案将取决于您的具体用例。
编辑:根据你的确切用例,根据我的说法,正确的解决方案应该是你创建一个协议(protocol) Attackable
并制作 Character
和 Enemy
符合它。
关于swift - 是否可以有多个参数选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57545380/