重铸&#39; UnsafePointer <void>&#39;到&#39; CFHTTPMessageRef&#39; </void>

时间:2014-11-04 03:29:21

标签: swift core-foundation

我已经尝试了很多东西才能做到这一点,并且无法想出任何有效的东西。任何人都可以告诉我以下Swift代码有什么问题:

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

上面的代码提供了错误消息:'UnsafePointer<Void>' 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'检查'success'会产生“Type'布尔'不符合协议'BooleanType'”。那是什么意思?布尔值不是布尔类型?

我发现Swift的严格类型检查非常令人沮丧。到目前为止,编写代码要比Obj-C,C或我使用过的任何其他语言困难得多。我确定这是因为我没有得到它,或者没有找到合适的文档,但这真的让我发疯了。

1 个答案:

答案 0 :(得分:3)

使用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