GVKun编程网logo

如何使用UIColor值创建Swift枚举?(swift uikit教程)

11

本文将介绍如何使用UIColor值创建Swift枚举?的详细情况,特别是关于swiftuikit教程的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于

本文将介绍如何使用UIColor值创建Swift枚举?的详细情况,特别是关于swift uikit教程的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于7.5 Swift枚举关联值、ios – 如何使用dx和dy(派生)创建Swift CGVector?、swift – 如何使用CGPoint的原始类型创建枚举?、swift – 如何创建几个缓存的UIColor的知识。

本文目录一览:

如何使用UIColor值创建Swift枚举?(swift uikit教程)

如何使用UIColor值创建Swift枚举?(swift uikit教程)

我正在制作绘图应用程序,我想通过枚举引用我的颜色。例如,Colors.RedColor每次我想要红色时,使用它会更干净,更方便,而不用键入值。但是,Swift的原始值枚举似乎并不接受UIColor作为类型。有没有办法用枚举或类似方法做到这一点?

答案1

小编典典

我这样做(基本上使用结构作为名称空间):

extension UIColor {  struct MyTheme {    static var firstColor: UIColor  { return UIColor(red: 1, green: 0, blue: 0, alpha: 1) }    static var secondColor: UIColor { return UIColor(red: 0, green: 1, blue: 0, alpha: 1) }  }}

您可以像这样使用它:

UIColor.MyTheme.firstColor

因此,您可以在自定义主题中使用红色。

7.5 Swift枚举关联值

7.5 Swift枚举关联值

/**

枚举相关值

可以让枚举值对应的原始值不是唯一的,而是一个变量.

每一个枚举可以是在某种模式下的一些特定值

后面加一个 元组

*/

enum LinesegmentDescriptor {

case StartAndEndPattern(start:Double,end:Double)

case StartAndLengthPattern(start:Double,length:Double)

}

var lsd = LinesegmentDescriptor.StartAndLengthPattern(start: 0.0,length: 100.0)

lsd = LinesegmentDescriptor.StartAndEndPattern(start: 0.0,end: 50.0)

print("--------->")

print(lsd)


// 利用switch提取枚举关联值

switch lsd {

case let .StartAndEndPattern(s,e):

print("start = \(s) end = \(e)")

case .StartAndLengthPattern(let s,let l):

print("start = \(s) lenght = \(l)")

}

// 输出结果: start = 0.0 end = 50.0

ios – 如何使用dx和dy(派生)创建Swift CGVector?

ios – 如何使用dx和dy(派生)创建Swift CGVector?

我试图理解如何在 Swift中创建Vector,因为当我执行CGVectorMake()时,告诉我将dx和dy(衍生物)作为CGFloat传递.
如何创建仅包含该信息的Vector(行)?

有人能解释一下吗?喜欢傻瓜?我在谷歌搜索但我仍然找不到简单的解释.

假设我想创建一个从点(0,0)到点(5,5)的向量.

解决方法

有许多可能的向量表示,一个是作为
从一个点到另一个点的“距离”或“位移”(比较 Euclidean vector: Representations).

从这个意义上说,从(0,0)到(5,5)的向量与
从(2,3)到(7,8)的向量,以及从点A到点B的向量
可以计算为

let pA = CGPoint(x: 2,y: 3) // Point A(2,3)
let pB = CGPoint(x: 7,y: 8) // Point B(7,8)
let vecAB = CGVector(dx: pB.x - pA.x,dy: pB.y - pA.y) // Vector from A to B
print(vecAB) // CGVector(dx: 5.0,dy: 5.0)

所以dx,dy代表“delta X”和“delta Y”,即距离
x和y方向上的点.在上面的例子中,你可以
将vecAB读作“在x方向上移动5个单位和5个单位
在y方向“,你会得到相同的结果A(0,0)
和B(5,5).

从(0,5)或从(2,8)的“线段” 不能用a代表单独矢量.你需要两个点,或一个点和一个矢量.

swift – 如何使用CGPoint的原始类型创建枚举?

swift – 如何使用CGPoint的原始类型创建枚举?

灵感来自于 this question. Swift支持使用任何原始类型创建枚举,所以能够使用原始类型的CGPoint创建枚举将是很好的。

但这段代码不会编译

enum MyEnum : CGPoint {
    case Zero
}

有以下错误

<REPL>:50:15: error: raw type 'CGPoint' is not convertible from any literal
enum MyEnum : CGPoint {
              ^
<REPL>:51:10: error: enum cases require explicit raw values when the raw type is not integer literal convertible
    case Zero
     ^

那么如何用原始类型的CGPoint来声明枚举?

给定代码有两个错误。

第一个是

error: raw type 'CGPoint' is not convertible from any literal
    enum MyEnum : CGPoint {

所以我们需要使CGPoint从文字转换

解决它的一个方法是扩展CGPoint,使其可以通过符合StringLiteralConvertible从String文字转换

extension CGPoint : StringLiteralConvertible {
    static func convertFromStringLiteral(value: String) -> CGPoint {
        return NSPointFromString(value) // CGPointFromString on iOS
    }

    static func convertFromExtendedGraphemeClusterLiteral(value: String) -> CGPoint {
        return NSPointFromString(value) // CGPointFromString on iOS
    }
}

我们现在可以从字符串文字创建CGPoint!

var p : CGPoint = "2,3"
println(p) // print (2.0,3.0)

第二个错误是

error: enum cases require explicit raw values when the raw type is not integer literal convertible
        case Zero
         ^

这很容易修复,只需要分配一些字符串字面值即可

enum MyEnum : CGPoint {
    case Zero = "0,0"
    case One = "1,1"
    case MagicPoint = "0,42"
}

println(MyEnum.Zero.toRaw()) // (0.0,0.0)
println(MyEnum.One.toRaw()) // (1.0,1.0)
println(MyEnum.MagicPoint.toRaw()) // (0.0,42.0)

现在你已经枚举了CGPoint的原始类型

使用它

if let p = MyEnum.fromraw(CGPoint(x:0,y:42)) {
    switch (p) {
    case .Zero:
        println("p is (0,0)")
        break
    case .One:
        println("p is (1,1)")
        break
    case .MagicPoint:
        println("p is magic point")
        break
    }
}

// print "p is magic point"

从元组创建CGPoint会更好,但是看起来是不可能的。

从grammar

literal → integer-literal­  floating-point-literal­  string-literal­

只有三种类型的文字,所以字符串是唯一的选择这里(除非你要1.2是(1,2))

swift – 如何创建几个缓存的UIColor

swift – 如何创建几个缓存的UIColor

我的代码中有自定义颜色.我多次使用它们,我想只分配一次.

情况/问题

如果我们看一下UIColor标题,我们可以看到以下内容:

[...]

// Some convenience methods to create colors.  These colors will be as calibrated as possible.
// These colors are cached.

open class var black: UIColor { get } // 0.0 white

open class var darkGray: UIColor { get } // 0.333 white

[...]

我已经创建了UIColor的扩展,如下所示:

import UIKit

extension UIColor {

    class func colorWithHexString(_ hex: String) -> UIColor {

        print("\(#function): \(hex)")

        // some code,then it return a UIColor

        return UIColor(
            red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,blue: CGFloat(rgbValue & 0x0000FF) / 255.0,alpha: CGFloat(1.0)
        )

    }

    // Option A
    open class var myColorOne : UIColor {
        get {
            return colorWithHexString("AABBCC")
        }
    }

    // Option B
    class func myColorTwo() -> UIColor {
        return colorWithHexString("DDEEFF")
    }
}

从那里我可以轻松地使用我的颜色,具有变量或功能.

// A
UIColor.myColorOne

// B
UIColor.myColorTwo()

可悲的是,我对此并不满意.实际上,每次我想使用这些颜色时:都会进行新的UIColor分配.

我试过的

Apple设法让他们的颜色显然被缓存了.我也想自己这样做.我尝试了几件事,但似乎没有一件事情是理想的.

1 – 使用dispatch_once✗

在Swift页面上可见:Swift中不再提供自由函数dispatch_once.

2 – 创建常量(let)✗

我收到以下错误:扩展可能不包含存储的属性

3 – 创建单身〜

它确实有效(每种颜色只创建一次),具体如下

import UIKit

class Colors : UIColor {

    // Singleton
    static let sharedInstance = Colors()

    let myColorOne : UIColor = {
        return UIColor.colorWithHexString("AABBCC")
    }()

    let myColorTwo : UIColor = {
        return UIColor.colorWithHexString("DDEEFF")
    }()

}

但它迫使我再增加一个文件并调用我的颜色

Colors.sharedInstance.myColorOne

难道没有办法像UIColor.myColorOne那样获得我想要的颜色并让它们像Apple一样缓存吗?

您可以使用与中的相同方法
Using a dispatch_once singleton model in Swift,即静止
常量存储属性
这是懒惰地初始化(只有一次).这些可以定义
直接在UIColor扩展中:
extension UIColor {
    convenience init(hex: String) {
        // ...          
    }

    static let myColorOne = UIColor(hex:"AABBCC")
    static let myColorTwo = UIColor(hex:"DDEEFF")
}

今天关于如何使用UIColor值创建Swift枚举?swift uikit教程的讲解已经结束,谢谢您的阅读,如果想了解更多关于7.5 Swift枚举关联值、ios – 如何使用dx和dy(派生)创建Swift CGVector?、swift – 如何使用CGPoint的原始类型创建枚举?、swift – 如何创建几个缓存的UIColor的相关知识,请在本站搜索。

本文标签: