2016-08-17 8 views
2

Это скорее вопрос концепции. Зачем беспокоиться об использовании init?При написании большого приложения в Swift мне даже нужно использовать метод «init» вообще?

class Person { 
     var name:String 
     var height:Double 
     ... 

     init(name: String) { 
     self.name = name 
     self.height:Double 
     ... 
    } 

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

var name = "Daniel" 
    var height = 178.0 

Таким образом, я также не придется беспокоиться о выборе между обозначенным «удобство» inits, потому что все будет просто наследовать от своего суперкласса. Есть ли причина для использования этого метода init?

Это позволяет использовать шаблоны кодирования, которые невозможно выполнить с помощью стандартного приложения с инициализацией по умолчанию? Или это по причинам, таким как управление ресурсами/памятью?

+1

Так что, когда вы не установили имя/высоту для нового человека, которого вы хорошо с ним названный 'Даниил', который является« 178 »ростом? –

+0

Если инициализатор не предоставлен программистом, Swift предоставляет инициализатор defalut, который устанавливает объявленное свойство в свое первоначальное объявленное свойство. Свойство должно быть объявлено либо значением nil, либо значением nil. – Khundragpan

+1

Итак, каждый экземпляр 'Person' должен по умолчанию иметь имя Daniel и иметь высоту 178? Это не похоже на хорошую идею.Имея ложные данные по умолчанию, просто приглашает ошибку программиста забыть заполнить эти поля реальными данными, что, по-видимому, должно гарантировать инициализатор в первую очередь. – Hamish

ответ

3

Давайте предположим, что у вас есть завод, который строит автомобили и инструмент/класс «BuildCar» со свойствами:

var numberOfTires = 4 

var color = UIColor.red() 

var maxSpeed = 100// mph 

Теперь вы хотите, чтобы построить целую кучу ваших дорогих машин и использовать «BuildCar» Инструмент для этого. Все, что вы можете сделать, это построить красный автомобилей с 4 шины и максимальная скорость 100 миль/ч.

Но что, если вы хотите построить новый автомобиль? Синий, с 4 шинами и максимальной скоростью 120? Если вы использовали init, вы можете легко изменить переменные.

+0

Охх. Понимаю. Если я делаю последовательные изменения в классе один шаг за раз, было бы намного проще, если бы класс сохранил прежние значения, а не дефолтировал их снова. Попался. Спасибо за отличное редактирование, penatheboss. –

+0

Добро пожаловать. И благодаря @penatheboss. – chriOSx

+0

Без проблем хороший ответ @Xtian – penatheboss

1

Если вы были очень осторожны, вы могли бы сойти с рук. Это потребует, чтобы вы сконфигурировали каждый объект Person со всеми правильными значениями сразу после его создания, чтобы предотвратить его использование значений по умолчанию.

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

Одна из опасностей заключается в том, что если кто-то другой (или вы в будущем) использует код, они могут инициализировать Person и не настроить его должным образом, что может привести к неожиданному поведению.

Предложение

Во многих случаях вам не нужно использовать class, вы можете уйти с помощью struct. Одним из магических свойств structs является то, что до тех пор, пока вы сами не создаете метод init, создается значение по умолчанию init, которое принимает значение для каждого свойства.

В вас случае, если Person был на структуру, вы можете инициализировать его, как это без написания инициализатора себя: Person(name: "David", height: 178)

+0

Я понимаю. Спасибо что нашли время ответить. –