2014-11-03 7 views
0

Obj-c에 익숙하고 Swift에 익숙해졌지만 Swift의 매우 엄격한 타입 검사와 관련하여 끔찍한 시간을 보냈습니다. 스위프트이에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))); 
    } 
} 

: 적절한 예는, 내가하고 싶었던 모든 아래의 Obj-C의 루틴을 변환했다

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'가 선언 되었습니까? –

답변

0

당신이 한 번에 인수를 고려하는 경우 :

  • 는 C 부울

    let m = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, 1).takeRetainedValue() 
    let f = incomingFileHandle! 
    let d = self.incomingRequests as CFMutableDictionaryRef 
    CFDictionaryAddValue(d, unsafeAddressOf(f), unsafeAddressOf(m)) 
    
    는 숫자로 표현해야합니다.

  • CFHTTPMessageCreateEmpty는 관리되지 않는 것으로 되돌아와 메모리 관리가 필요합니다.

  • incomingFileHandle은 선택 사항입니다. 언 래핑이 필요합니다.

  • CFDictionaryAddValue는 안전하지 않은 주소 (UnsafePointer)를 예상합니다.

+0

감사합니다. 큰 도움이되었습니다! 하지만 마음에 들지 않는다면 왜 CFDictionary가 값을 유지하도록 설정되어있을 때 'takeRetainedValue()'를 포함해야합니까? 또한 래핑되지 않은 변수가 주소라는 인상하에있었습니다. 마지막으로, 왜 'unsafeAddressOf'입니까? 실제 객체를 가리키는 것에 대해 안전하지 않은 것은 무엇입니까? –

+0

무슨 뜻인지 아시면 코를 따라 가세요. 예를 들어, CFDictionaryAddValue의 Swift 선언을보십시오 :'func CFDictionaryAddValue (theDict : CFMutableDictionary!, key : UnsafePointer , 값 : UnsafePointer )'. 당신이 말했듯이, Swift는 엄격합니다. 그래서'UnsafePointer '객체를 실제로 제공하지 않는 한이 점을 통과시키지 않을 것입니다.'unsafeAddressOf'를 호출하는 방법이 하나뿐입니다. 이것은'const void *'캐스트와 정확히 같습니다. – matt

+0

'takeRetainedValue()'에 대해서는 이미 설명했습니다. CFHTTPMessageCreateEmpty는 Unmanaged를 반환하고, Swift에서 관리 방법을 알릴 때까지 Swift에서 Unmanaged로 아무 것도 할 수 없습니다. 이것은 여러분의'bridge' 캐스팅과 정확히 같습니다. 이 메소드는 이름에 "Create"를 가지므로 유지됩니다. 스위프트에게 말해야합니다. 그렇지 않으면 유출됩니다. (Objective-C에서는 그렇게하지 못했습니다.) – matt