对于后代:这个问题引用了iOS8 Beta 4
我试图让NSData
个实例充满24位颜色。字节数为[r,g,b, r,g,b, ...]
,每种颜色3个字节,所有颜色都紧密排列在一起。
问题是我需要一些Uint8
作为字节来填充我从CGFloats
UIColor
派生的字节。从CGFloat
转换为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
}
我尝试过一堆组合转换为某些中间类型,例如Float
或Int
,但无济于事。
而且,我的方法在这里是否理智?我错过了一种更简单的方法吗?
答案 0 :(得分: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。从这些中间转换中,您可以转换为其他类型。
答案 1 :(得分:1)
这适用于beta4游乐场:
let red : CGFloat = 0.5
let redByte = UInt8(Int(red * 255.0))
答案 2 :(得分: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
似乎编译器应该能够解决这个问题。