Swift GCD覆盖中的类型不匹配

Swift GCD覆盖中的类型不匹配,swift,grand-central-dispatch,libdispatch,Swift,Grand Central Dispatch,Libdispatch,我想使用从文件描述符读取一些数据。创建通道后,下一步是调用,其声明如下: func read(offset: off_t, length: Int, queue: DispatchQueue, ioHandler: @escaping (Bool, DispatchData?, Int32) -> Void) length参数的文档说明: 要从通道读取的字节数。指定SIZE_MAX以继续读取数据,直到达到EOF 看起来很容易。在我的情况下,我只想这样做-读到EOF。因

我想使用从文件描述符读取一些数据。创建通道后,下一步是调用,其声明如下:

func read(offset: off_t, 
   length: Int, 
    queue: DispatchQueue, 
ioHandler: @escaping (Bool, DispatchData?, Int32) -> Void)
length
参数的文档说明:

要从通道读取的字节数。指定SIZE_MAX以继续读取数据,直到达到EOF

看起来很容易。在我的情况下,我只想这样做-读到EOF。因此,我将通过
SIZE\u MAX

// `queue` and `handler` defined elsewhere
channel.read(offset: 0, length: SIZE_MAX, queue: queue, ioHandler: handler)
精明的读者猜测编译器不喜欢这样:

无法将“UInt”类型的值转换为预期的参数类型“Int”

SIZE\u MAX
属于
UInt
类型,但
length
属于
Int
类型。编译器提供了以下修复方法:

channel.read(offset: 0, length: Int(SIZE_MAX), queue: queue, ioHandler: handler)
但是,当然,在运行时,这并不是很好:

致命错误:没有足够的位来表示有符号的值

当然,如果
SIZE\u MAX
是可由
UInt
表示的最大值,则
Int
不能表示它。经过快速搜索,我找到了。既然它似乎还没有被解决——我不确定自己是否有能力通过拉请求来解决它——我该如何解决这个问题?还是我错过了做我想做的事的方法



Swift Stdlib基本原理文件。它归结为“更少的类型转换,谁需要指定2^63以上的数字(对不起,32位平台)。”这很公平,但这不包括像我这样的问题,使用
SIZE\u MAX
是API的一部分。

如果你在64位平台上,只需使用
Int.MAX
,您仍然几乎可以保证在读取
Int.max
字节之前到达文件末尾。在32位平台上,如果文件非常大,可能需要执行多个读取操作

然后你应该向苹果公司报告这个问题。我不确定Dispatch IO库是属于苹果还是Swift开源项目,或者它只是一个文档错误

更新

源代码是开源的,读取操作只是一个简单的C函数包装器,其长度为
size\u t


我还没有试过,但您几乎可以肯定地使用位模式,甚至可能
-1
。我想我还是会选择
Int.max

传递
length:Int(bitPattern:SIZE\u max)
有效吗?可能会!它至少可以编译并且不会崩溃。老实说,我还没有找到一个合理的方法来测试这个。我不能准确地创建一个2^64字节长的数据流,我也不能准确地理解
Int
是如何通过Swift-to-C接口转换成
size\t
的。我测试了如何将
Int(bitPattern:size\u MAX)
作为
size\u t
传递到一个伪C函数中,并且它确实按照预期工作,这个参数比较起来等于C中的
SIZE\u MAX
。在此基础上,我接受这个。