2016-10-03 36 views
7

我想在Linux上編譯一些使用CoreFoundation和Foundation的代碼,但是Linux並沒有像MacOS和iOS那樣實​​現橋接。橋接Linux上的CoreFoundation

Objective-C和雨燕之間的橋接工作方式:

import Foundation 
import CoreFoundation 
import Glibc 

func wantsNSString(_ string: NSString) { 
     print(string) 
} 

let string = "Hello, world!" 
wantsNSString(string._bridgeToObjectiveC()) 

但我無法弄清楚如何彌合到的CoreFoundation。我不能只傳遞一個NSString到想要的功能的CFString

import Foundation 
import CoreFoundation 
import Glibc 

func wantsCFString(_ string: CFString) { 
     print(string) 
} 

let string = "Hello, world!" 
wantsCFString(string._bridgeToObjectiveC()) //error: cannot convert value of type 'String._ObjectType' (aka 'NSString') to expected argument type 'CFString' 

我不能只投它像在MacOS:

import Foundation 
import CoreFoundation 
import Glibc 

func wantsCFString(_ string: CFString) { 
     print(string) 
} 

let string = "Hello, world!" 
wantsCFString(string._bridgeToObjectiveC() as CFString) 
//error: 'String._ObjectType' (aka 'NSString') is not convertible to 'CFString'; did you mean to use 'as!' to force downcast? 

使用as!如錯誤消息表明編譯但結果在運行時(Illegal instruction),和as?碰撞產生錯誤:

error: conditional downcast to CoreFoundation type 'CFString' will always succeed 

Bridging.swift有在NS和CF類型之間轉換的協議,許多類型都有初始化程序和屬性,但這些都是internalprivate。我可能只是使用CFStringCreateWithCString,但這需要與其他類對,如InputStreamCFReadStream

我在這裏丟失了什麼,或者真的沒有辦法在Linux上的Foundation和CoreFoundation類型之間進行轉換?

+0

這是行不通的? http://stackoverflow.com/a/24900185/603977醜陋的雙重演員。不過,不瞭解Linux。 Linux上Swift的大問題是ObjC運行時不在那裏。 –

+0

@JoshCaswell否; Swift和Foundation之間的橋接[不是由編譯器自動完成](https://github.com/apple/swift-corelibs-foundation/blob/master/Docs/Issues.md),這就是爲什麼我必須使用臨時的'_bridgeToObjectiveC'方法,並且在第三個例子中我試着從'NSString'轉換爲'CFString'。 – NobodyNada

回答

1

它看起來像我可以unsafeBitCastNSString /從CFString

import Foundation 
import CoreFoundation 
import Glibc 

func wantsCFString(_ string: CFString) { 
     print(string) 
} 

let string = "Hello, world!" 
wantsCFString(unsafeBitCast(string._bridgeToObjectiveC(), to: CFString.self) 
//prints "Hello, world!" 

這是有道理的,因爲的CoreFoundation及基礎類型被設計爲具有相同的內存佈局 - 這就是爲什麼免費橋接的作品。儘管我對基金會的Swift實現起作用,但我有些驚訝。