首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >要求Array在Swift协议中最小大小

要求Array在Swift协议中最小大小
EN

Stack Overflow用户
提问于 2016-08-06 19:17:11
回答 1查看 245关注 0票数 1

我有一个对象,它将逐行输出像素(就像以前的电视机一样)。这个对象只需将字节写入二维数组。所以有很多的水平线,每条都有很多像素。这些数字是固定的:有x个水平线,每一行y个像素。像素是红色、绿色、蓝色的结构。

我希望这个类的客户端插入可以写入这些值的自己的对象,就像我希望这段代码2在苹果平台上(在CALayer存在的地方)很好地工作一样,但也可以在其他平台(例如Linux,需要在没有CALayer的情况下完成呈现)上工作。所以我想制定这样的协议:

代码语言:javascript
运行
复制
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 }
}

这些协议可以在以下几个方面使用:

代码语言:javascript
运行
复制
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

出现了两个问题:

  • 如何要求协议PixelLine在数组中至少有1280个像素单元,以及在数组中要求协议OutputReceivable至少有720个PixelLine元素?
  • 正如我从录象中学到的,使用泛型可以帮助编译器生成最优的代码。是否有一种方法可以让我使用泛型来生成更好的代码,然后使用简单的协议作为一种类型?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-06 19:53:08

Swift中不存在依赖类型。不能直接要求数组的最小大小。您可以做的是创建只能使用特定数据构造的新类型。因此,在这种情况下,更好的模型是使PixelLine成为一个结构,而不是一个协议。然后,您可以拥有一个init?,在使用它之前确保它是合法的。

一个简单的数组结构包装器的内存成本为零,调度成本极低。如果您处理的是一个高性能的系统,那么封装Array的结构就是一个很好的起点。

代码语言:javascript
运行
复制
struct PixelLine {
    let pixels: [Pixel]
    init?(pixels: [Pixel]) {
        guard pixels.count >= 1280 else { return nil }
        self.pixels = pixels
    }
}

您可以像这样直接公开pixels,或者使PixelLine成为将其所需方法转发给pixels的集合(甚至只是序列)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38807908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档