2016-02-13 2 views
2

Я пытаюсь улучшить свои объектно-ориентированные навыки, и я всегда обсуждаю, нужен ли класс или нет.Цвета, которые будут использоваться во всем приложении или классе

У меня есть набор UIColors, что я постоянно используя в течение моего приложения в различных ViewControllers, я изначально, добавив их как постоянные глобалам как следовать ...

import UIKit 
// Global COLORS 
let myBlueColor = UIColor(red: 62.0/255, green: 174.0/255, blue: 206.0/255, alpha: 1.0) 
// more global colors here... 
class ViewController1{ 
    // using my global color 
    myButton.layer.borderColor = myBlueColor.CGColor 
} 


// other viewController 
import UIKit 
class ViewController2{ 
    // using my global color again 
    myButton2.layer.borderColor = myBlueColor.CGColor 
} 

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

Color Class

import Foundation 
import UIKit 

class Color { 

    var myBlueColor:UIColor{ 
     get{ 
      return UIColor(red: 62.0/255, green: 174.0/255, blue: 206.0/255, alpha: 1.0) 
     } 
    } 
    var myLightGrayColor:UIColor{ 
     get{ 
      return UIColor(red: 249.0/255, green: 249.0/255, blue: 249.0/255, alpha: 1.0) 
     } 
    } 
    var myGreenColor:UIColor{ 
     get{ 
      return UIColor(red: 110.0/255, green: 186.0/255, blue: 64.0/255, alpha: 1.0) 
     } 
    } 
    var myRedColor:UIColor{ 
     get{ 
      return UIColor(red: 247.0/255, green: 118.0/255, blue: 113.0/255, alpha: 1.0) 
     } 
    } 
    var myYellowColor:UIColor{ 
     get{ 
      return UIColor(red: 255.0/255, green: 190.0/255, blue: 106.0/255, alpha: 1.0) 
     } 
    } 
} 

View Controller

import UIKit 
class ViewController1{ 

    private var myColor = Color() 

    // some other code here... 

    myButton.layer.borderColor = myBlueColor.CGColor 
} 

Other View Controller

import UIKit 
class ViewController1{ 

    private var myColor = Color() 

    // some other code here... 

    myButton2.layer.borderColor = myBlueColor.CGColor 
} 

мой объектно-ориентированный лучший подход? Хорошо, позвольте мне перефразировать это, это даже то, как вы сделали бы это более объектно-ориентированным способом?

Я не знаю, но мой класс Color выглядит странно, просто используя геттеры (вычисленные свойства).

Любые предложения по улучшению моего кода.

РЕДАКТИРОВАТЬ: Не дубликат, потому что меня интересовало улучшение моего объектно-ориентированного примера, а не знание того, можно ли использовать globals.

Благодаря

+1

Возможный дубликат файла [Глобальные константы в Swift] (http://stackoverflow.com/questions/26252233/global-constants-file-in-swift) –

ответ

5

Определенно хорошая идея, но вы, вероятно, можете сделать его еще более ясно, просто расширяя UIColor и делает эти все функции класса, точно так же, как встроенный UIColor.whiteColor() и т.д.

Вы можете сделать это как это:

extension UIColor { 

class func peachColor() -> UIColor { 
    return UIColor(colorLiteralRed: 100.00/100.00, green: 92.9/100.0, blue: 65.9/100.0, alpha: 1.0) 
} 
... 

}

Затем, в любом месте вашего приложения, вы можете сказать UIColor.peachColor(), и он будет работать отлично. Эти расширения классов - это чистый способ сделать это, и это позволит вам не помещать var myColor = Color() в каждый контроллер представления.

+1

Лучшая и простая реализация – Mihado

+0

Ничего себе, когда я начал читать документацию Swift, я фактически пропустил раздел «Расширения», думая, что это то, что я никогда не буду использовать или, по крайней мере, не часто, но это ОЧЕНЬ крутая функция. Большое спасибо за подсказку. Для тех, кто никогда не использовал расширения, вот что я сделал. '1. Создал новый быстрый файл и назвал его UIColor 2. Добавлена ​​цветовая функция, описанная @creeperspeak 3. Используется ваш пользовательский цвет как UIColor.myCustomColor() ' –

1

Если вы хотите, чтобы инкапсулировать свои цвета в классе, и они не изменятся, лучший способ сделать это в среде ООП является использование public static final переменных.

(My Swift очень ржавый, в лучшем случае, так что это может быть неправильный синтаксис, но это должно быть ясно, тем не менее.)

final struct MyColors { 
    public static final blue:UIColor = UIColor(red: 62.0/255, green: 174.0/255, blue: 206.0/255, alpha: 1.0) 
    // etc 
} 

Вы можете ссылаться на значение с помощью MyColors.blue туда, куда вы хотите, и это будет относиться к одному определенному объекту UIColor.

+0

Мне тоже нравится этот подход. Я не думаю, что 'final' может использоваться в структурах. 'import UIKit окончательный класс Цвета { статический синий: UIColor = UIColor (красный: 62.0/255, зеленый: 174.0/255, синий: 206.0/255, alpha: 1.0) }' Большое спасибо за ваше предложение. –

1

Предполагая, что вы пытаетесь использовать ваше приложение в глобальном масштабе с цветами, вам следует изучить API App Appearance API, UIAppearance.

Например, чтобы установить цвета по умолчанию для всех UINavigationBars в вашем приложении, вы могли бы назвать:

UINavigationBar.appearance().tintColor = myColor 

Вы также можете установить другие свойства внешнего вида, такие как фоновые изображения

Для получения дополнительной информации см :

http://nshipster.com/uiappearance/ https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIAppearance_Protocol/ https://gist.github.com/mattt/5135521

+0

Спасибо за отзыв. –