【问题标题】:Recasting 'UnsafePointer<Void>' to 'CFHTTPMessageRef'将“UnsafePointer<Void>”重铸为“CFHTTPMessageRef”
【发布时间】:2014-11-04 03:29:20
【问题描述】:

我已经尝试了很多方法来解决这个问题,但就是想不出任何可行的方法。谁能告诉我以下 Swift 代码有什么问题:

let incomingRequest: CFHTTPMessageRef? = CFDictionaryGetValue(self.incomingRequests as CFMutableDictionaryRef, unsafeAddressOf(incomingFileHandle!)) as CFHTTPMessageRef

上面的代码给出了错误信息:'UnsafePointer&lt;Void&gt;' is not convertible to 'CFHTTPMessageRef'

我想我不明白的是如何将 Core Foundation 函数返回的“UnsafePointer”转换为它应该是的指针类型(即本例中的 CFHTTPMessageRef)。我如何找到有关如何执行此操作的文档。我已经阅读了我能找到的所有内容,但到目前为止还没有任何内容解释如何将返回值重新转换为它们本来应该是的值。这必须记录在某个地方,不是吗?

编辑

这是我遇到问题的代码:

let incomingRequest = CFDictionaryGetValue(self.incomingRequests as CFMutableDictionaryRef, unsafeAddressOf(incomingFileHandle!))
        unsafeBitCast(incomingRequest, CFHTTPMessageRef.self)
if (incomingRequest != nil) {
let success: Boolean = CFHTTPMessageAppendBytes(incomingRequest as CFHTTPMessageRef, unsafeAddressOf(data!.bytes) as UnsafePointer<UInt8>, data!.length)
if success { // Do something... }

CFHTTPMessageAppendBytes 调用仍然给出“类型‘UnsafePointer’不符合协议‘AnyObject’”。下面的“if”检查“成功”抱怨“类型'Boolean'不符合协议'BooleanType'”。这到底是怎么回事? Boolean 不是布尔类型吗?

我发现 Swift 的严格类型检查非常令人沮丧。到目前为止,它比 Obj-C、C 或我用过的任何其他语言都更难编写代码。我确定这是因为我不明白,或者没有找到正确的文档,但这真的让我发疯。

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/q/24838106/535275
  • 我检查了链接,但它似乎并不适用。它没有显示如何将 UnsafePointer 转换为其他 CF 函数所需的指针类型。如果输入不正确,他们将不会接受。或者也许我错过了什么......
  • 你应该使用unsafeBitCast的返回值
  • 你能看到我的评论吗?你至少应该做“var castedRequest: CFHTTPMessageRef = unsafeBitCast(incomingRequest, CFHTTPMessageRef.self)”
  • 你好硕。是的,很抱歉我之前错过了(我猜是累坏了)。看起来我必须为返回布尔值(而不是布尔值)的 CF 函数做类似的事情。我不明白区别,但如果你想直接测试布尔返回函数的结果,这是必要的。我希望有一些我可以在网上或 PDF 中参考的东西来解释 Bool 和 Boolean 之间的区别,以及为什么这种区别很重要。还有一些东西可以解释为什么大多数 CF 函数在需要显式类型的对象作为输入变量时返回 UnsafePointer

标签: swift core-foundation


【解决方案1】:

使用 unsafeBitCast。如下例:

import Foundation
var x = "1"
var dict : NSMutableDictionary = [x: "2"]
var y = CFDictionaryGetValue(dict as CFMutableDictionaryRef, unsafeAddressOf(x))
let str: NSString = unsafeBitCast(y, NSString.self)
str == "2"

仅供参考:有一个与 unsafeBitCast 相关的 quora。 http://www.quora.com/Why-does-Swift-not-allow-implicit-type-conversion

【讨论】:

  • 谢谢。我实现了 unsafeBitCast 并编译了它,但它并没有有效地改变任何东西。我已经用我遇到问题的代码编辑了原始帖子:
  • 请将您的代码更新为您原来的问题吗?看不到你的代码。
  • 我用新的代码片段更新了我的原始帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 2013-05-27
相关资源
最近更新 更多