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
。在此基础上,我接受这个。