2016-04-28 2 views
0

Давайте просто скажем, у меня есть следующий класс:значения по умолчанию в пределах класса

class car { 
    var brand = ["BWM", "Ford", "Audi","Toyota" 
    var color = ["Red", "Blue", "White", "Black" 
    var speed = Double() 
    var weight = Double() 
} 

У меня есть UITableView, что позволяет пользователю добавить строку, и выбрать новый автомобиль на основе бренда.

Теперь можно сказать, что все БМВ красные, поэтому цвет установлен на красный. Я думаю, что я мог бы достичь, добавив:

Init(){ 
If brand == "BMW"{ 
color = "red"} 

Но я также хочу, чтобы установить значения по умолчанию для других марок, и это похоже на долгий путь ведения дел. Есть ли более простой способ?

+0

Вы можете использовать словарь для этого или индекс массива. «BMW»: «Красный» или если индекс массива 1 цвет красный, индекс 2 цвет зеленый ... зависит от контекста –

+0

Вы можете использовать перечисления, если хотите. –

ответ

0

Я думаю, вы должны переоценить свой класс. У одного автомобиля нет нескольких брендов, поэтому ваше имущество brand должно быть перечислением, равно как и вашим цветом.

После того, как вы определяете класс автомобиля, BMW является то подкласс Car где переопределить поведение инициализации:

enum CarBrand { 
    case BMW 
    case Ford 
    case Audi 
    case Toyota 
} 

enum CarColor { 
    case Red 
    case Blue 
    case White 
    case Black 
} 

class Car { 
    var brand: CarBrand 
    var color: CarColor 
    var weight: Double 
    var maxSpeed: Double 

    init(brand: CarBrand, color: CarColor, weight: Double, maxSpeed: Double) { 
     self.brand = brand 
     self.color = color 
     self.weight = weight 
     self.maxSpeed = maxSpeed 
    } 
} 

class BMWCar : Car { 
    init(weight: Double, maxSpeed: Double) { 
     super.init(brand: .BMW, color: .Red, weight: weight, maxSpeed: maxSpeed) 
} 


let aCar = Car(brand: .Audi, color: .Blue, weight: 1760, maxSpeed: 200) 

let aBMWCar = BMWCar(weight: 1800, maxSpeed: 220) 

Строго говоря Car должен быть абстрактным классом, но это напрямую не поддерживается в Свифт.

+0

спасибо Пол. Это помогло много – LateNate

+0

Это кажется очень незаметным подходом. Создание отдельного подкласса для каждого модельного автомобиля нарушает базовый объектно-ориентированный дизайн. «BMWCar» не является специализированным типом «Автомобиля». Это «Автомобиль» с определенными значениями для свойств «Car». Этот ответ аналогичен подклассу 'UILabel' для каждой метки, которая имеет другой цвет фона. – rmaddy

+0

Я согласен в какой-то степени, но я думаю, что ситуация в вопросе довольно надуманна. Почему все BMW будут красными? OP фактически просил об ограничении одного свойства на основе другого во время инициализации. Есть и другие проблемы с моим ответом; в настройке «color» должно быть переопределение, чтобы предотвратить изменение цвета BMW. Но, на ваш взгляд, если вы хотите ограничить фоновый цвет 'UILabel' на основе его шрифта, вам придется подкласс, так как вы не можете изменить инициализатор' UILabel'. – Paulw11

0

Вы также можете объявить новый класс BMW, являющийся подклассом автомобиля, и установить цвет в красный цвет методом init.

Смежные вопросы