2016-10-03 28 views
7

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?

+0

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. –

+0

@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

cevap

1

görünüyor gibi elimden unsafeBitCast için/CFString den NSString: CoreFoundation ve Vakıf türleri aynı bellek düzeni içermesi tasarlandı, bu durum mantıklı

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!" 

- işte bu yüzden ücretsiz köprü çalışmaları var. Yine de, Swift'in Swift uygulamasıyla çalışmasına şaşırdım.