用于存储相关常量的全局变量/单例替代方法

时间:2015-12-11 14:46:45

标签: ios swift design-patterns

我正在开发一款游戏,并希望创建一个简单的应用程序皮肤配置。

我遇到了设备特定的常量。例如,我想存储特定于设备的字体大小。让我们说我需要iPhone为30,iPad需要45。现在我通过声明全局变量来做到这一点:

// ViewController.swift
Import UIKit
// ...

class ViewController: UIViewController, CustomUserControlDelegate {

    // Properties
    // ...
    @IBOutlet weak var customUserControl: CustomUserControl!
        // Instance of CustomUserControl in this UIViewController

    override func viewDidLoad() {
        super.viewDidLoad()
        // ...

        // Custom user control, handle through delegate callbacks.
        customUserControl.delegate = self
    }

    // ...

    // CustomUserControlDelegate
    func didChangeValue(value: Int) {
        // do some stuff with 'value' ...
    }

}

然后像这样使用它:

let h2FontSize : CGFloat = UIDevice.currentDevice().userInterfaceIdiom == .Pad ? 45 : 30

但这似乎不是一个漂亮的解决方案,因为我也有h1,h3 fontSize,它们看起来都一样。

private let topLabel = CCLabelTTF(string: "", fontName: mainFontName, fontSize: h2FontSize)

如何处理特定于设备的常量?

2 个答案:

答案 0 :(得分:1)

  

如何处理特定于设备的常量?

将它们作为数据模型的一部分。这些值不是真正的常量 - 它们在设置后可能不会更改,但它们在执行期间配置,并且它们取决于运行应用程序的环境的详细信息。因此,请将它们视为应用中的任何其他数据,并将它们放入数据模型中。

答案 1 :(得分:0)

您可以执行以下操作:

private extension UIDevice {
    static func isIpad() -> Bool {
        return currentDevice().userInterfaceIdiom == .Pad
    }
}

struct Font {
    struct Size {
        static let H1: CGFloat = UIDevice.isIpad() ? 60 : 45
        static let H2: CGFloat = UIDevice.isIpad() ? 45 : 30
        static let H3: CGFloat = UIDevice.isIpad() ? 30 : 15
    }
}

然后,可以直接在Font结构中创建所有Font样式。因此,如果您需要更多样式,您可以使H1返回带有您需求的样式UIFont,而不仅仅是CGFloat,它会使您的样式更加分离。

然后,您可以通过创建一个Style结构来改进这一点,该结构将UIDevice作为依赖项而不是使用currentDevice()单例。