2016-02-13 28 views
2

我试图提高自己的面向对象技能,并且一直在辩论是否需要类。将在整个应用程序或类中使用的颜色

我有一组我经常在不同的ViewControllers使用我的整个应用程序UIColors的,我最初将其添加为全局常量如下开始...

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 
} 

但后来我决定创建一类强迫自己认为更注重像这样的方式......

色级

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) 
     } 
    } 
} 

视图控制器

import UIKit 
class ViewController1{ 

    private var myColor = Color() 

    // some other code here... 

    myButton.layer.borderColor = myBlueColor.CGColor 
} 

其他视图控制器

import UIKit 
class ViewController1{ 

    private var myColor = Color() 

    // some other code here... 

    myButton2.layer.borderColor = myBlueColor.CGColor 
} 

是我的面向对象的更好的方法?好吧,让我重述一下这个,你甚至可以用更加面向对象的方式来做这件事吗?

我不知道,但我的颜色类看起来很奇怪,只是使用getters(计算属性)。

任何建议,以改善我的代码。

编辑:不是重复的,因为我有兴趣改善我的面向对象的例子,而不是知道全局变量是否可以使用。

感谢

+1

Swift中全局常量文件的可能重复(http://stackoverflow.com/questions/26252233/global-constants-file-in-swift) – 2016-02-13 03:08:02

回答

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。创建一个新的swift文件并将其命名为UIColor 2.添加了@creeperspeak描述的颜色函数3.使用您的自定义颜色作为UIColor.myCustomColor()' –

1

如果你想封装你的颜色在一个阶层,他们不会改变,在一个面向对象的环境,这样做的最好方法是使用public static final变量。

(我的雨燕是很生疏充其量所以这可能是不正确的语法,但它应该是清楚不过。)

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 final class Colors静态蓝色:UIColor = UIColor(红色:62.0/255,绿色:174.0/255,蓝色:206.0/255,alpha:1.0) }'非常感谢您的建议。 –

1

假设您试图用颜色在全局范围内呈现应用程序主题,则应该查看Apple的外观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

感谢您的提示。 –

相关问题