我正在尝试基于Erica
Sadun的方法
在Swift中构建异步文件下载。但是我需要它来处理更大的文件,因此我找到了有关使用NSOutputStream而不是NSData的答案,这是有意义的。
但是,我无法使其正常工作。当我尝试将NSData字节(在我的NSURLConnection
didReceiveData函数中)添加到NSOutputStream写入函数时,出现以下错误:'()' is not identical to 'UInt8'
在该行:bytesWritten = self.downloadStream.write(data.bytes, maxLength: bytesLeftToWrite)
。
data.bytes
是类型ConstUnsafePointer<()>
,.write()
函数期望类型是ConstUnsafePointer<UInt8>
,因此从这个意义上说,错误是完全合理的。但是由于我是iOS的新手,当然还不熟悉Swift编程,所以我不了解如何解决此问题。
因此,如何将转换data.bytes: ConstUnsafePointer<()>
为ConstUnsafePointer<UInt8>
alt。以其他方式进行这项工作?
我的didReceiveData
功能:
func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
var bytesLeftToWrite: NSInteger = data.length
var bytesWritten: NSInteger = 0
while bytesLeftToWrite > 0 {
bytesWritten = self.downloadStream.write(data.bytes, maxLength: bytesLeftToWrite)
if bytesWritten == -1 {
break
}
bytesLeftToWrite -= bytesWritten
let responseExpectedlenght: NSNumber = NSNumber(longLong: self.downloadResponse!.expectedContentLength)
let dataLength: NSNumber = NSNumber(long: data.length)
self.downloadProgressPercentage = ((dataLength / responseExpectedlenght) * 100)
println("Downloaded: \(self.downloadProgressPercentage)%")
}
}
您可以使用以下方法转换指针UnsafePointer()
:
bytesWritten = self.downloadStream.write(UnsafePointer(data.bytes), maxLength: bytesLeftToWrite)
在写循环中还有一个问题,因为您总是将数据对象的 初始 字节写入 输出流。
它可能看起来与此类似(未试用):
var bytes = UnsafePointer<UInt8>(data.bytes)
var bytesLeftToWrite: NSInteger = data.length
while bytesLeftToWrite > 0 {
let bytesWritten = self.downloadStream.write(bytes, maxLength: bytesLeftToWrite)
if bytesWritten == -1 {
break // Some error occurred ...
}
bytesLeftToWrite -= bytesWritten
bytes += bytesWritten // advance pointer
// ...
}
问题内容: 我试图写一个给斯威夫特。使用Objective C以这种方式编写字符串通常可以将其作为NSData传递 这行不通 这产生了错误 “ NSData”不可转换为“ UnsafePointer” 用于将数据写入流的行。 您将如何在Swift中将字符串写入NSOutputStream? 问题答案: 这里有两个问题。首先是您要传递给(而不是)(就像您在Objective- C代码中传递的那样)。
问题内容: 这个问题的解决方案不再适用于Swift 3。 不再有一个属性的(前身。 有了这段代码,我得到了错误: 你怎么能写一斯威夫特3? 问题答案: 具有访问字节的属性。Swift 3中的新值类型具有一个 方法,该方法调用带有指向字节的指针的闭包。 因此,这就是您写入的方式 (不强制转换为): 备注: 是通用方法: 在上述调用中,两者和都是由编译器自动推断的(as 和),从而无需进行其他 转换。
问题内容: 最近,我迅速找到了源代码,并试图将其发布到Objective-C。我无法理解的一件事是: 有人可以帮我获得与Obj-C相当的产品吗? 为了给您提供一些背景信息,我需要将UInt8作为UInt8发送到CoreBluetooth外设(CBPeripheral)。浮点数或整数将不起作用,因为数据类型太大。 问题答案: 如果您将Swift代码编写为稍微简单一点 那么将其转换为Objective
问题内容: 我有一个返回字符串的函数。该字符串包含回车符和换行符(0x0D,0x0A)。但是,当我写入文件时,它仅包含换行符。有没有一种方法可以使输出包括回车和换行符。 问题答案: 如果要写入字节,则应以二进制模式打开文件。
问题内容: 这段代码曾经很好(在某种意义上,编译器没有抱怨): 从Swift 5.0开始,这会产生警告: 警告:不建议使用“ withUnsafeBytes”:请改用 我试着用所提出的方法,但我似乎无法缠斗到这最终需要。 如何以不推荐的方式编写此函数? 问题答案: 诀窍是使用函数: 尽管此功能适用于Swift 5.0,但显然存在一些问题。参见相关论坛讨论。
问题内容: 我正在尝试 从字节数组创建一个。 在Obj-C中,我可能这样做: 我无法弄清楚Swift中的等效功能。 问题答案: 有一个带有指针的初始化程序:。一个参数可以接受多种不同的东西,包括一个简单的斯威夫特阵列,所以你可以使用几乎相同的语法在Objective-C。传递数组时,需要确保将其标识为数组,否则Swift的类型推断将假定您要创建一个数组。 您可以在Apple的与C API交互的 文