2015-03-13 3 views
3

Я работаю свой путь через книгу о Patterns Swift Дизайна и наткнулся на пример, где автор хочет, чтобы гарантировать, что любая инициализацию подкласса определенного класса должен передавать значение требуемого базового класса:Необычная стремительная идиома - для чего?

class Employee { 
    private var professionBV: String // BV = backingVariable 

    private init(profession: String) { 
     self.professionBV = profession 
    } 

    final var profession: String { 
     return professionBV 
    } 
} 

// Even if you create your own init here, you always have to pass in a 
// value for profession 
class Nurse: Employee { } 

Что я не понимаю, это то, что автор набирает, используя опорную переменную в сочетании с вычисленным свойством. Разве это не просто эквивалент этому:

// Remove the backing variable, mark profession as final - what have I lost? 
class Employee { 
    final private var profession: String 

    private init(profession: String) { 
     self.profession = profession 
    } 
} 

ответ

5

Вы правы - если нет сеттера и никакой дополнительной логики обработки вы получаете немного от этого «каркасного переменного» подхода. Это просто беспорядок. Если позже вы обнаружите, что хотите поместить некоторую логику между пользователем класса и фактической сохраненной переменной, вы всегда можете переключить его на вычисленное свойство (или добавить willSet/didSet). На самом деле, если значение будет неизменным после инициализации, оно должно быть объявлено с let не var. Это в основном звучит как совет программиста Java или C#, применяющего методы для этих языков для Swift.

Из интереса, что это за книга?

+0

Книга представляет собой * Pro Design Patterns в Swift *, и я на самом деле очень впечатлен этим. Интересно, что вы упоминаете '' Java'' и '' C#'', хотя, поскольку сам автор упоминает эти два языка совсем не так, откуда он использует эту идиому. –

2

Первый пример делает переменную профессии доступной для чтения везде - только доступ на запись (через переменную подстановки) ограничен одним и тем же файлом, определяющим класс Employee. Второй пример предотвращает его чтение из других файлов.

Но теперь есть лучшая возможность для достижения этой цели - вы можете настроить другой модификатор доступа для сеттера:

class Employee { 
    private(set) final var profession : String 
} 

Это оставляет сорбент с разрешениями по умолчанию, но требует того же файла для сеттера ,

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