2017-01-12 8 views
0

Скажем, у меня естьСтруктурированные свойства в протоколе

protocol Theme { 
    var headerTextColor: UIColor { get } 
    var footerTextColor: UIColor { get } 

    var headerImage: UIImage { get } 
    var footerImage: UIImage { get } 
} 

struct DarkTheme: Theme { 
    var headerTextColor: UIColor { return ... } 
    var footerTextColor: UIColor { return ... } 

    var headerImage: UIImage { return ... } 
    var footerImage: UIImage { return ... } 
} 

struct LightTheme: Theme { 
    var headerTextColor: UIColor { return ... } 
    var footerTextColor: UIColor { return ... } 

    var headerImage: UIImage { return ... } 
    var footerImage: UIImage { return ... } 
} 

So экземпляр, который реализует этот свойства протокола доступа к следующим

lightTheme.headerTextColor 
darkTheme.footerImage 

То, что я хотел бы добиться того, чтобы как-то структурировать эти свойства, чтобы последний фрагмент выглядел бы подобным

lightTheme.color.headerText 
darkTheme.image.footer 
+2

Зачем использовать протокол здесь вообще? 'Тема 'выглядит точно как структура. Все, что требует темы, будет иметь свойство 'theme', а не кучу суб-свойств. Тогда тривиально выложить это так, как вам нравится. –

+0

@RobNapier Я немного изменил свой вопрос. –

+1

Почему существуют отдельные структуры 'DarkTheme' и' LightTheme'? Мне ничего не мешает установить свойства экземпляра 'LightTheme' для темных цветов и изображений. Как говорит Роб, для этого вам просто нужно использовать одну структуру. – Hamish

ответ

3

Что я хотел бы добиться того, чтобы как-то структура эти свойства так , что последний фрагмент кода будет выглядеть

lightTheme.color.headerText 
darkTheme.image.footer 

Вы уже подчеркивали «структуру» себя в этом запросе: просто создайте настраиваемые структуры, которые дадут дерево свойств по вашему вкусу. Например.

/* set these properties to 'var' in case you plan to 
    mutate them beyong initialization */ 

struct Colors { 
    let headerText: UIColor 
    let footerText: UIColor 
    // ... 
} 

struct Images { 
    let header: UIImage 
    let footer: UIImage 
    // ... 
} 

Как уже отмечались в комментариях к вашему вопросу, нет, казалось бы, никакой разницы между типами DarkTheme и LightTheme кроме значений их общих свойств. Это означает, что вы, вероятно, просто хотите определить один тип Theme и имеете экземпляров этого типа, которые описывают разные темы (например, темная и легкая тема).

Используя справочные структуры, как указано выше, например .:

struct Theme { 
    let color: Colors 
    let image: Images 
    // ... 
} 

// two Theme instances 
let darkTheme = Theme(/* initialize with some "dark" theme 
          values for the member properties 
          of Theme */) 

let lightTheme = Theme(/* some "light" theme */) 

// access subproperties of each theme (which are as initialized) 
darkTheme.color.headerText 
lightTheme.image.footer 

/* if you want to mutate these themes on the fly, simply set 
    the instance properties of Theme and the help structures to 
    mutables ('var') */ 
Смежные вопросы