我想在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類型之間轉換的協議,許多類型都有初始化程序和屬性,但這些都是internal
或private
。我可能只是使用CFStringCreateWithCString
,但這需要與其他類對,如InputStream
和CFReadStream
。
我在這裏丟失了什麼,或者真的沒有辦法在Linux上的Foundation和CoreFoundation類型之間進行轉換?
這是行不通的? http://stackoverflow.com/a/24900185/603977醜陋的雙重演員。不過,不瞭解Linux。 Linux上Swift的大問題是ObjC運行時不在那裏。 –
@JoshCaswell否; Swift和Foundation之間的橋接[不是由編譯器自動完成](https://github.com/apple/swift-corelibs-foundation/blob/master/Docs/Issues.md),這就是爲什麼我必須使用臨時的'_bridgeToObjectiveC'方法,並且在第三個例子中我試着從'NSString'轉換爲'CFString'。 – NobodyNada