У меня есть класс:

class WeaponItems {

var name: String
var index: Int
var price: Int
var weaponPower: Int = 0
var attackSpeed: Double = 0
var criticalChance: Double = 0
var criticalDamage: Double = 0

init(name: String, index: Int, price: Int){
    self.name = name
    self.index = index
    self.price = price
}

var weaponBlade = WeaponItems(name: "Weapon Blade", index: 0, price: 300)
weaponBlade.weaponPower = 15
// Error: expected declaration

var swiftShooter = WeaponItems(name: "Swift Shooter", index: 1, price: 300)
swiftShooter.attackSpeed = 0.2
// Error: expected declaration

var minionsFoot = WeaponItems(name: "Minions Foot", index: 3, price: 300)
minionsFoot.criticalChance = 0.1
minionsFoot.criticalDamage = 0.1
// Error: expected declaration

}

Мне нужно установить weaponPower attackSpeed ... для каждого элемента, я получил ошибку, делая это таким образом.

Я нашел ответы, в которых говорится, что вам нужно использовать функцию для изменения значений экземпляров, но я чувствую, что это усложняет код, как мне установить его значение в противном случае?

Проблема использования функции заключается в том, что она разделит процесс создания экземпляра и процесса установки значений, что усложняет сопровождение кода.

1
Bright 8 Сен 2016 в 10:41

2 ответа

Вы должны добавить свойства для всех оружейных элементов в классе

Тогда реализация вашего класса должна выглядеть так

class WeaponItems {

    var name: String
    var index: Int
    var price: Int
    var weaponPower: Int = 0
    var attackSpeed: Double = 0
    var criticalChance: Double = 0
    var criticalDamage: Double = 0

    var weaponBlade:WeaponItems{

        get {
            let tempWeaponBlade = WeaponItems(name: "Weapon Blade", index: 0, price: 300)
            tempWeaponBlade.weaponPower = 15
            return tempWeaponBlade
        }
    }

    var swiftShooter:WeaponItems{

        get {
            let tempSwiftShooter = WeaponItems(name: "Swift Shooter", index: 1, price: 300)
            tempSwiftShooter.attackSpeed = 0.2
            return tempSwiftShooter
        }
    }

    var minionsFoot:WeaponItems{

        get {
            let tempMinionsFoot = WeaponItems(name: "Minions Foot", index: 3, price: 300)
            tempMinionsFoot.criticalChance = 0.1
            tempMinionsFoot.criticalDamage = 0.1
            return tempMinionsFoot 
        }
    }


    init(name: String, index: Int, price: Int){
        self.name = name
        self.index = index
        self.price = price
    }

}
3
praths 8 Сен 2016 в 08:13

В вашем случае, если код будет компилироваться, чтобы использовать ваш предварительно созданный weaponBlade, вы должны создать два экземпляра WeaponItems, как показано ниже:

let balde = WeaponItems(name: "", index: 0, price: 0).weaponBlade

Это не лучшее решение, даже потому, что в вашем случае он вообще не компилируется (вы можете прочитать комментарий @ gnasher729, чтобы понять, почему).

Я предлагаю вам создать их статические экземпляры

extension WeaponItems {
    static var Blade: WeaponItems {
        get {
            let blade = WeaponItems(name: "The name", index: 1, price: 300)
            blade.weaponPower = 15
            return blade
        }
    }
}

И теперь вы можете использовать лезвие, набрав WeaponItems.Blade, или, если это тип, легко определить, как показано ниже:

let blade: WeaponItems = .Blade
1
Hamish 8 Сен 2016 в 09:06