【问题标题】:Swift: How to put often used code into a single place to reuse it?Swift:如何将经常使用的代码放在一个地方进行复用?
【发布时间】:2017-12-04 11:36:25
【问题描述】:

我仍在尝试掌握所有这些编程概念,并且我有一个带有 rgb 颜色的简单 UIView,并且我在许多不同的视图上使用它。

现在我仍在对每个视图中的颜色进行硬编码:

UIColor(red: 120/255, green: 51/255, blue: 2/255, alpha: 1.0

但我想创建一个 swift 文件(例如称为 Colors.swift),然后我想把所有颜色都放在那里。

现在,在每个视图中,我只想从这个文件中获取颜色,这样我就只有一个地方可以在必要时更改颜色。

我知道如何在 swift 文件中创建一个函数并从另一个地方调用它。例如,我重用的所有动画都放在一个文件中,但是对于这些颜色,我会出现停电。我不知道如何将它们放入另一个文件并将它们从那里取出。完美的是某种具有不同命名颜色(蓝色、绿色……)及其相应 rgb 值的开关盒,这样我就可以调用颜色的名称来获取它。这将是我创建的一个快速文件:

import UIKit

let myColors = UIColor()

switch myColors {
case .red:
    UIColor(red: 120/255, green: 51/255, blue: 2/255, alpha: 1.0)
case .gray:
    UIColor(red: 120/255, green: 120/255, blue: 120/255, alpha: 1.0)
default:
    UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 1.0)
}

但是当我在 swift 文件中编写 switch 语句时,我无法让它工作。我得到的错误是 "statements are not allowed on top level" 并且每个 case 都会得到错误 "Results of UIColor initializer is used",但我看不到方法把它放在什么东西里面?

也许整个方法都是错误的?

【问题讨论】:

标签: ios swift colors switch-statement


【解决方案1】:

您可以使用 Swift 扩展来实现此功能。

// Colors.swift
extension UIColor {

   var myCustomRed: UIColor { 
      return UIColor(red: 120/255, green: 51/255, blue: 2/255, alpha: 1.0)
   }
}

// elsewhere in the app
view.backgroundColor = UIColor.myCustomRed

您可以在其中放置任意数量的自定义实现,只是注意不要使用与现有颜色冲突的名称。

有关更多信息,请参阅文档Swift Extensions Documentation

更新:

enum ThemeColors: UIColor {
    case red = UIColor(red: 120/255, green: 51/255, blue: 2/255, alpha: 1.0)
    case blue = UIColor(red: 2/255, green: 51/255, blue: 120/255, alpha: 1.0) 
}

view.backgroundColor = ThemeColors.red

【讨论】:

  • 谢谢。这行得通,但我想把它放到一个类中只是为了学习更多函数式编程的概念,但在这种情况下,UIColor 的扩展似乎更容易。
  • 使用类被认为是面向对象的编程。 Swift 对这种类型的东西有扩展。如果你真的想要,你可以使用枚举,用一个例子来更新
  • 非常感谢您的帮助!
【解决方案2】:

对于重复使用的函数和变量

创建一个GlobalFunctions.swift 根类为NSObject 的类,并在此处声明您重复使用的变量和函数

在你的情况下:-

import UIKit

class GlobalFunctions: NSObject {

    static let redColor = UIColor(red: 120/255, green: 51/255, blue: 2/255, alpha: 1.0
    static let greyColor = UIColor(red: 120/255, green: 120/255, blue: 120/255, alpha: 1.0)
    static let defaultColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 1.0)
}

您可以在所需的视图控制器中使用此颜色,例如:

GlobalFunctions.redColor
GlobalFunctions.greyColor
GlobalFunctions.defaultColor

无需为GloablFunctions.swift 创建对象。您可以直接访问颜色对象,因为我们已将其声明为 static 变量。您还可以添加类函数以在项目中递归使用。

【讨论】:

    【解决方案3】:

    你需要把它放到一个类中。您可以简单地将颜色变量设为静态,因此您不需要实例化该类:

    class Colors: NSObject {
        static let color: = UIColor(red: 120/255, green: 51/255, blue: 2/255, alpha: 1.0)
    }
    

    然后像这样使用它:

    import Colors
    
    Colors.color
    

    你也可以在那里定义你的枚举。

    【讨论】:

    • 谢谢,这正是我想要的。这很好用,当我尝试创建枚举时,我收到错误“预期声明”。
    猜你喜欢
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 2016-08-10
    • 2013-04-25
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2015-07-10
    相关资源
    最近更新 更多