swift - 是否可以有多个参数选择?

标签 swift xcode parameters

假设我有这样一个函数:

func myFunc(myObject: MyObjectA){}

但是如果我想让 myObject 变成 MyObjectBMyObjectC 怎么办?有没有一种方法可以为一个和相同的参数提供多个可能的参数替代方案?

注意:我不想要额外的参数,我希望同一个参数能够接受许多不同的类。像这样:

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 并相应地更改函数的其余部分.

最佳答案

不幸的是,您无法以您想要的方式获得您正在寻求的行为。

您可以采用以下解决方案之一:

  1. 创建具有不同函数签名的多个函数
  2. 使MyObjectAMyObjectB等符合相同的协议(protocol)或子类化为相同的类
  3. 泛型

方法 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 并制作 CharacterEnemy 符合它。

关于swift - 是否可以有多个参数选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57545380/

相关文章:

ios - 在上传到 Github 时,为了安全起见,我应该从 Xcode 项目中删除任何内容吗?

ios - Xcode 5.1.1 不会停止模拟器上的应用程序

ios - 无法访问不同类的 map View

ios - 保留关键字不会在 Xcode 4.6 ARC 项目中抛出编译器错误?

ios - 当应用程序在 tvOS 中播放视频期间从后台进入前台时,前进和后退不起作用

java - 如何在Java中使用参数返回一个新对象?

python - 使用相同的字典作为各种函数的参数,有些函数的参数较少

android - 在 Android 中设置相机图像大小

swift - 什么是 Objective C 运行时特性?

Swift coredata 按关系属性排序?