2016-09-08 2 views
0

У меня есть класс:Как изменить значение экземпляра без использования функции?

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 

} 

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

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

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

+0

Почему вы не просто продлить инициализации, чтобы включить все переменные? –

+0

@ Z.Hung, как я должен это делать? –

+0

@BrightFuture у вас уже есть имя, индекс и цена. Так что, возможно, добавьте остальные (например, оружие, атаку, критический удар и критический удар). Поэтому, когда вы объявляете var для оружия, вы можете включить все статистические данные в скобки –

ответ

1

Если вы хотите иметь значения свойств по умолчанию, которые вам также понравятся при настройке при создании экземпляра, я бы рекомендовал использовать default parameter values в вашем инициализаторе. Это позволит вам создать новый экземпляр вашего класса WeaponItems с фактическими значениями значений, известными при инициализации, а не некоторыми значениями по умолчанию, которые вы затем меняете сразу после.

Я также категорически согласен with Luca D'Alberti - вам не нужно, чтобы ваше «предустановленное оружие» было экземпляром. Поскольку они не полагаются на какое-либо состояние экземпляра или уникальны для данного экземпляра, они должны быть static.

Например:

class Weapon { 

    static var blade : Weapon { 
     return Weapon(name: "Blade", index: 0, price: 300, power: 15) 
    } 

    static var swiftShooter : Weapon { 
     return Weapon(name: "Swift Shooter", index: 1, price: 300, attackSpeed: 0.2) 
    } 

    static var minionsFoot : Weapon { 
     return Weapon(name: "Minions Foot", index: 3, price: 300, criticalChance: 0.1, criticalDamage: 0.1) 
    } 

    var name: String 
    var index: Int 
    var price: Int 
    var power: Int 
    var attackSpeed: Double 
    var criticalChance: Double 
    var criticalDamage: Double 

    init(name: String, index: Int, price: Int, 
     power: Int = 0, attackSpeed: Double = 0, 
     criticalChance: Double = 0, criticalDamage: Double = 0) { 

     self.name = name 
     self.index = index 
     self.price = price 
     self.power = power 
     self.attackSpeed = attackSpeed 
     self.criticalChance = criticalChance 
     self.criticalDamage = criticalDamage 
    } 
} 

let blade = Weapon.blade 
let swiftShooter : Weapon = .swiftShooter 
+0

Отличный ответ ! Значения параметров по умолчанию настолько круты, что он сократил мой код на 2/3; вы правы в отношении свойств типа, иначе логика этого класса будет бесполезной. –

+0

Это на самом деле решило мою ошибку :) –

+0

@BrightFuture Happy to help :) – Hamish

-1

Добавление функций для получения/установки переменных класса является правильным. Это не сделает ваш код сложным, но он сделает его более функциональным, что на самом деле является более масштабируемым подходом.

Следовательно, создайте функции getWeaponPower(), которые возвратят значение weaponPower и setWeaponPower(weaponPower: Int), чтобы установить новое значение этой переменной.

+0

Это не решая его самодельную «проблему». Он не хочет писать код для вызова этих функций. Кроме того, это просто _AWFUL_. – gnasher729

+0

@ gnasher729 AWFUL как в? Что я могу вывести из ваших текущих комментариев, это то, что ему нужно. Поскольку он не хочет включать их в метод 'init'. – iamabhishek

0

Вы можете попробовать использовать код ниже.

lazy var weaponBlade:WeaponItems = { 

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

Пожалуйста, обратитесь в этом link, чтобы узнать больше о ленивом переменной.

3

вы должны добавить свойства для всех weaponItems в классе

тогда ваша реализация класса должна выглядеть следующим образом

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 
    } 

} 
+1

Почему вы добавили свойства необязательно, когда они возвращают необязательные значения? Вам также не нужен явный ответ 'get {}' – Hamish

+0

Хороший ответ, я попробовал, и он работает. 2 предложения tho: 1. экземпляры необязательно быть необязательными; 2. 'get {}' можно упростить, поскольку он получает только –

+0

@Hamish имеет точку –

1

В вашем случае, если код будет компилироваться, чтобы использовать ваш предварительно создан 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 
+0

Спасибо, что указали это, но на данный момент я думаю, что я просто придерживаюсь кода @ Prathamesh, так как он больше подходит для моего уровня, определенно положил бы некоторые мысли в ваше решение :) –

+0

Ваш выбор :) @BrightFuture –