无法使用“(Unmanaged<CFHTTPMessage>!)”类型的参数列表调用 'CFHTTPMessageCopySerializedMessage'

Cannot invoke 'CFHTTPMessageCopySerializedMessage' with an argument list of type '(Unmanaged<CFHTTPMessage>!)'

我按照 Apple 的文档进行操作,但是在 Swift 中,我遇到了这个错误。

let url = "http://www.apple.com"
let myURL = CFURLCreateWithString(kCFAllocatorDefault, url, nil);

let myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, "GET", myURL, kCFHTTPVersion1_1)
let mySerializedRequest = CFHTTPMessageCopySerializedMessage(myRequest)

无法使用“(Unmanaged< CFHTTPMessage>!)”类型的参数列表调用 'CFHTTPMessageCopySerializedMessage'

这是您的工作代码:

let url = "http://www.apple.com"
let myURL = CFURLCreateWithString(kCFAllocatorDefault, url, nil)
let myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, "GET", myURL, kCFHTTPVersion1_1).takeRetainedValue()
let mySerializedRequest = CFHTTPMessageCopySerializedMessage(myRequest).takeRetainedValue()

当非托管对象具有 +1 保留计数并且您希望 ARC 在您完成后负责释放对象时,您使用 takeRetainedValue

在你的例子中,CFHTTPMessageCopySerializedMessage 的定义是:

func CFHTTPMessageCopySerializedMessage(message: CFHTTPMessage!) -> Unmanaged<CFData>!

所以你必须传递 CFHTTPMessage 类型的参数,你的 myRequest 类型没有使用 takeRetainedValue()Unmanaged<CFHTTPMessage>! 所以 CFHTTPMessageCopySerializedMessage 永远不会接受它这就是为什么你必须像这样在最后添加 takeRetainedValue()

let myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, "GET", myURL, kCFHTTPVersion1_1).takeRetainedValue()

它会很好地工作。