3

后代:这个问题是指 iOS8 Beta 4

我正在尝试获得一个NSData充满 24 位颜色的实例。字节将是[r,g,b, r,g,b, ...]每种颜色的 3 个字节,全部紧密地打包在一起。

问题是我需要一些Uint8s 用作字节来填充我从 of 派生CGFloatsUIColor。而从CGFloatto转换UInt8让我很难过

'CGFloat' 不能转换为 'UInt8'

我读过这个问题:'CGFloat' is not convertible to 'UInt8' and other CGFloat issues with Swift and Xcode 6 beta 4

这是相同的错误消息,但我要收集的是并非所有数值都是相互之间的转换,我必须使用中间类型。但我不确定是哪个。

let lightCount: Int = 48
var colors: [UIColor] // inited by appending "lightCount" UIColor instances

func dataBlob() -> NSData {
    var data = NSMutableData(capacity: lightCount*3)

    for i in 0..<lightCount {
        var r: CGFloat = 0
        var g: CGFloat = 0
        var b: CGFloat = 0

        colors[i].getRed(&r, green: &g, blue: &b, alpha: nil)

        data.appendBytes([
            UInt8(r * 255.0),
            //    ^ ERROR: CGFloat is not convertible to UInt8

            UInt8(g * 255.0),
            UInt8(b * 255.0),
        ], length: 3);
    }

    return data
}

我尝试了一堆组合来转换为一些中间类型,例如FloatInt无济于事。

此外,我在这里的做法是否合理?有没有我错过的更简单的方法?

4

3 回答 3

2

这似乎对我有用:

var arr = [
UInt8( Int( r * 255)),
UInt8( Int( g * 255)),
UInt8( Int( b * 255)),
]
data.appendBytes(arr, length: 3);

据我所知,您可以来回转换为 CGFloat 的类型是 Int、UInt、Float 和 Double。从这些中间转换中,您可以转换为其他类型。

于 2014-07-26T20:25:07.300 回答
1

这适用于 beta4 操场:

let red : CGFloat = 0.5
let redByte = UInt8(Int(red * 255.0))
于 2014-07-26T20:23:38.407 回答
1

好吧,我想通了,感谢你们提出的一些好问题。我必须转换为Int并且必须将数组转换为[Uint8].

        var bytes: [UInt8] = [
            UInt8(Int(r * 255.0)),
            UInt8(Int(g * 255.0)),
            UInt8(Int(b * 255.0))
        ]
        data.appendBytes(bytes, length: 3);

或者:

        data.appendBytes([
            UInt8(Int(r * 255.0)),
            UInt8(Int(g * 255.0)),
            UInt8(Int(b * 255.0))
        ] as [UInt8], length: 3);
        // ^ casted here

似乎编译器确实应该能够解决这个问题。

于 2014-07-26T20:36:09.383 回答