2014-11-03 74 views
0

我熟悉Obj-c並熟悉Swift,但是我在使用Swift的非常嚴格的類型檢查時遇到了可怕的時間。典型的例子,所有我想做的事是在下面的OBJ-C轉換的程序:從Swift調用Core-Foundation方法

- (void)receiveIncomingConnectionNotification:(NSNotification *)notification { 
    NSDictionary *userInfo = [notification userInfo]; 
    NSFileHandle *incomingFileHandle = [userInfo objectForKey:NSFileHandleNotificationFileHandleItem]; 

    if (incomingFileHandle) { 
     CFDictionaryAddValue(
      incomingRequests, 
      (__bridge const void *)(incomingFileHandle), 
      (__bridge const void *)((__bridge id)CFHTTPMessageCreateEmpty(kCFAllocatorDefault, TRUE))); 
    } 
} 

對此斯威夫特:

func receiveIncomingConnectionNotification(notification: NSNotification) { 
    let userInfo: NSDictionary = notification.userInfo! 
    let incomingFileHandle: NSFileHandle? = userInfo.objectForKey(NSFileHandleNotificationFileHandleItem) as? NSFileHandle 
    if (incomingFileHandle != nil) { 
     CFDictionaryAddValue(self.incomingRequests as CFMutableDictionaryRef, incomingFileHandle, CFHTTPMessageCreateEmpty(kCFAllocatorDefault, true)) 
    } 
} 

但CFDictionaryAddValue呼叫保持指向「真正產生錯誤「參數,上面寫着」Cannot convert the expression's type '(CFMutableDictionaryRef, NSFileHandle?, Unmanaged<CFHTTPMessage>!' to type BooleanLiteralConvertible!

任何人都知道正確的方法來做到這一點,或者說一個BooleanLiteralConvertible是什麼?

+0

'incomingRequests'是如何聲明的? – 2014-11-03 19:14:21

回答

0

它會更清楚如果你考慮在一個時間參數之一:

let m = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, 1).takeRetainedValue() 
let f = incomingFileHandle! 
let d = self.incomingRequests as CFMutableDictionaryRef 
CFDictionaryAddValue(d, unsafeAddressOf(f), unsafeAddressOf(m)) 
  • 的C布爾必須表示爲一個數字。

  • CFHTTPMessageCreateEmpty需要內存管理,因爲它回來作爲非託管。

  • 您的incomingFileHandle是可選的;它需要解開。

  • CFDictionaryAddValue預計不安全的地址(UnsafePointer)。

+0

謝謝,這是一個很大的幫助!但是如果你不介意,爲什麼當CFDictionary被設置爲保留添加的值時,我必須包含'takeRetainedValue()'?另外,我的印象是一個解包的變量是一個地址?最後,爲什麼一個'unsafeAddressOf'?指向實際對象的不安全? – 2014-11-03 19:46:31

+0

如果你明白我的意思,你只需要跟着你的鼻子。例如,看一下CFDictionaryAddValue的斯威夫特聲明:'FUNC CFDictionaryAddValue(theDict:CFMutableDictionary!關鍵:UnsafePointer ,值:UnsafePointer )'。好了,就像你說的,斯威夫特是嚴格的,所以它不會讓我們通過這一點,除非我們實際上提供了'UnsafePointer '對象,只有一個辦法讓那些,即通過調用'unsafeAddressOf'。這與你的'const void *'強制類型完全平行。 – matt 2014-11-03 19:52:00

+0

至於'takeRetainedValue()',我已經解釋過了。 CFHTTPMessageCreateEmpty返回一個Unmanaged,你不能對Swift中的Unmanaged做任何事情,除非你告訴Swift如何管理它。這與你的「橋樑」劇組完全平行。這個方法的名字中有「Create」,所以它被保留;你需要告訴Swift,否則你會泄漏它。 (我注意到你在Objective-C中沒有這麼做。) – matt 2014-11-03 19:54:43

相關問題