0

今日、Swift の構造とクラスについて学んでいたので、新しく見つけた知識を使って、以前に作成した戦闘計算機を合理化することにしました。これで、func で呼び出されるプロパティは本質的にローカル変数であり、さらに「let」定数であることがわかりました。したがって、以下のコードにエラーがある理由はわかりますが、理解できないのは、nil 合体演算子 (??) を使用してコードをさらに複雑にすることなく目標を達成する方法です。

アドバイスをいただければ幸いです。

import Foundation
import Glibc


struct Unit {
   enum UnitType: String {
       case sniper
       case shocktrooper
       case infantry
       case support
   }
   let name: String
   let type: UnitType 
   var hitPoints: Int
   let attackStrength: Int

   //attack another unit
   mutating func attack(target: Unit) {
       print("\(self.name) is attacking \(target.name)...")
       if self.attackStrength > target.attackStrength {
           print("\(self.name) hit \(target.name) for
\(self.attackStrength) points of damage!")
           target.hit(target, self.attackStrength) /*error: cannont use
muatating member on imutable value: 'target is a 'let' constant */
       } else {
           self.repelled(by: target.attackStrength)
       }
   }
   //take damage from defender
   mutating func repelled(by damage: Int) {
       self.hitPoints -= damage
       print("\(name) was repelled and took \(damage) points of damage!")
   }
   //take damage from attack
   mutating func hit(for damage: Int) {
       self.hitPoints -= damage
   }
}

//declaring two seperate units
var player1 = Unit(name: "Player 1", type: .sniper, hitPoints: 10,
attackStrength: 3)
var player2 = Unit(name: "Player 2", type: .shocktrooper, hitPoints: 15,
attackStrength: 2)


func score() {
   print("The current hitpoints are: \(player1.name): \(player1.hitPoints)
& \(player2.name): \(player2.hitPoints)")
}

player1.attack(target: player2)
score()
4

1 に答える 1

0

inoutplayer2 を変更するには、キーワードを使用する必要があります。

struct Unit {
    enum Kind: String {
        case sniper, shocktrooper, infantry, support
    }
    let name: String
    let kind: Kind
    var hitPoints: Int
    let attackStrength: Int
    mutating func attack(target: inout Unit) {
        print("\(name) is attacking \(target.name)...")
        if attackStrength > target.attackStrength {
            print("\(name) hit \(target.name) for \(attackStrength) points of damage!")
            target.hit(for: attackStrength)
        } else {
            repelled(by: target.attackStrength)
        }
    }
    mutating func repelled(by damage: Int) {
        hitPoints -= damage
        print("\(name) was repelled and took \(damage) points of damage!")
    }
    mutating func hit(for damage: Int) {
        hitPoints -= damage
    }
}

遊び場でのテスト

var player1 = Unit(name: "Player 1", kind: .sniper, hitPoints: 10,  attackStrength: 3)
var player2 = Unit(name: "Player 2", kind: .shocktrooper, hitPoints: 15, attackStrength: 2)
func score() {
    print("The current hitpoints are: \(player1.name): \(player1.hitPoints) & \(player2.name): \(player2.hitPoints)")
}
player1.attack(target: &player2)
score()

これは印刷されます

プレイヤー 1 がプレイヤー 2 を攻撃している...

プレイヤー 1 がプレイヤー 2 に 3 ポイントのダメージを与えました。

現在のヒットポイントは: プレイヤー 1: 10 & プレイヤー 2: 12


もう 1 つのオプションは、構造体の代わりにクラスを使用することです。クラスにカスタム初期化子を提供し、メソッドから変更キーワードを削除する必要があります

class Unit {
    enum Kind: String {
        case sniper, shocktrooper, infantry, support
    }
    let name: String
    let kind: Kind
    var hitPoints: Int
    let attackStrength: Int
    init(name: String, kind: Kind, hitPoints: Int,  attackStrength: Int){
        self.name = name
        self.kind = kind
        self.hitPoints = hitPoints
        self.attackStrength = attackStrength
    }
    func attack(target: Unit) {
        print("\(name) is attacking \(target.name)...")
        if attackStrength > target.attackStrength {
            print("\(name) hit \(target.name) for \(attackStrength) points of damage!")
            target.hit(for: attackStrength)
        } else {
            repelled(by: target.attackStrength)
        }
    }
    func repelled(by damage: Int) {
        hitPoints -= damage
        print("\(name) was repelled and took \(damage) points of damage!")
    }
    func hit(for damage: Int) {
        hitPoints -= damage
    }
}
let player1 = Unit(name: "Player 1", kind: .sniper, hitPoints: 10,  attackStrength: 3)
let player2 = Unit(name: "Player 2", kind: .shocktrooper, hitPoints: 15, attackStrength: 2)
func score() {
    print("The current hitpoints are: \(player1.name): \(player1.hitPoints) & \(player2.name): \(player2.hitPoints)")
}
player1.attack(target: player2)
score()
于 2018-02-09T04:11:41.800 に答える