我有一个对象,它将逐行输出像素(就像以前的电视机一样)。这个对象只需将字节写入二维数组。所以有很多的水平线,每条都有很多像素。这些数字是固定的:有x个水平线,每一行y个像素。像素是红色、绿色、蓝色的结构。
我希望这个类的客户端插入可以写入这些值的自己的对象,就像我希望这段代码2在苹果平台上(在CALayer存在的地方)很好地工作一样,但也可以在其他平台(例如Linux,需要在没有CALayer的情况下完成呈现)上工作。所以我想制定这样的协议:
struct Pixel
{
var red: UInt8 = 0
var green: UInt8 = 0
var blue: UInt8 = 0
}
protocol PixelLine
{
var pixels: [Pixel] { get }
}
protocol OutputReceivable
{
var pixelLines: [PixelLine] { get }
}这些协议可以在以下几个方面使用:
let pixelLineIndex = ... // max 719
let pixelIndex = ... // max 1279
// outputReceivable is an object that conforms to the OutputReceivable protocol
outputReceivale.pixelLines[pixelLineIndex][pixelIndex].red = 12
outputReceivale.pixelLines[pixelLineIndex][pixelIndex].green = 128
outputReceivale.pixelLines[pixelLineIndex][pixelIndex].blue = 66出现了两个问题:
发布于 2016-08-06 19:53:08
Swift中不存在依赖类型。不能直接要求数组的最小大小。您可以做的是创建只能使用特定数据构造的新类型。因此,在这种情况下,更好的模型是使PixelLine成为一个结构,而不是一个协议。然后,您可以拥有一个init?,在使用它之前确保它是合法的。
一个简单的数组结构包装器的内存成本为零,调度成本极低。如果您处理的是一个高性能的系统,那么封装Array的结构就是一个很好的起点。
struct PixelLine {
let pixels: [Pixel]
init?(pixels: [Pixel]) {
guard pixels.count >= 1280 else { return nil }
self.pixels = pixels
}
}您可以像这样直接公开pixels,或者使PixelLine成为将其所需方法转发给pixels的集合(甚至只是序列)。
https://stackoverflow.com/questions/38807908
复制相似问题