Linux'ta hem CoreFoundation hem de Foundation kullanan bazı kodları derlemeye çalışıyorum ancak Linux, macOS ve iOS ile aynı şekilde köprüleme gerçekleştirmiyor.Linux'ta CoreFoundation'a bağlanma/köprü oluşturma
import Foundation
import CoreFoundation
import Glibc
func wantsNSString(_ string: NSString) {
print(string)
}
let string = "Hello, world!"
wantsNSString(string._bridgeToObjectiveC())
Ama CoreFoundation için köprü nasıl bilemiyorum: Objective-C ve Swift arasında Köprü
çalışır. Sadece istediği bir işleve bir NSString
geçemez bir CFString
: Sadece MacOS üzerinde gibi döküm olamaz
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'
: hata mesajı gibi as!
kullanma
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?
derler önerir ama
error: conditional downcast to CoreFoundation type 'CFString' will always succeed
: çalışma zamanı (Illegal instruction
) ve as?
bir çarpışma ile sonuçlanır hata üretir, NS ve CF türleri arasında dönüştürme için protokollere sahiptir ve birçok türde başlatıcı ve özelliklere sahiptir, ancak bunların hepsi internal
veya private
'dur. Ben sadece CFStringCreateWithCString
kullanın, ancak bu InputStream
ve CFReadStream
gibi diğer sınıf çiftleriyle çalışmak gerekir.
Burada bir şey eksik mi, yoksa Linux'taki Foundation ve CoreFoundation türleri arasında dönüştürme yapmanın bir yolu yok mu?
Bu işe yarar mı? http://stackoverflow.com/a/24900185/603977 Çirkin çift döküm. Linux hakkında bilmiyorum. Swift on Linux ile büyük "gotcha", ObjC çalışma zamanının orada olmamasıdır. –
@JoshCaswell No; Swift ve Foundation arasında köprü oluşturma [henüz derleyici tarafından otomatik olarak yapılmamaktadır] (https://github.com/apple/swift-corelibs-foundation/blob/master/Docs/Issues.md), bu yüzden geçici '_bridgeToObjectiveC' yöntemini kullanın ve üçüncü örneğimde' NSString''den 'CFString'e dönüştürmeyi denedim. – NobodyNada