2017-12-09 10 views
0

Cで表現できる型にジェネリックを拘束したいと思います。すべてのC型が準拠しているSwift標準ライブラリにプロトコルまたは型がありますか?swiftには "C Type"プロトコルがありますか?

func doWithCType<T:CRepresentable>(cValue: T) { 
    // do thing with C type 
} 

CRepresentableでない場合は、おそらくCStructタイプですか?

手がかり:

このC型の使用:

typedef struct { 
    int hodor; 
} Hodor; 

を私は(クラッシュを引き起こす)互換性のない型に構造体を鋳造強制。これはエラーメッセージでした:Could not cast value of type '__C.Hodor' (0x1035c0700) to 'Swift.CVarArg' (0x107196240).

"__C"はどこにも見つかりませんが、Cタイプの区別があることを期待しています。

+0

あなたが何を考えるか "Cにおける型表現"? C言語では何も生のメモリとして表現できます...プレーンなデータ型ですか? –

+0

C関数への引数として受け入れることができる構造体やintのようなc型です。私はvoid *ルートを避けることを望んでいます。 – dave234

+0

私はSwift/Cメッセージキューを作ろうとしています。 – dave234

答えて

1

Swift.CVarArgは必要ですか?これは、Cのva_listのvarargsのメカニズムを通ることができるタイプ用です。

CVaListPointerもあり、これはva_list *に相当します。それはString(format:)の議論に現れます。

https://developer.apple.com/documentation/swift/cvararg https://developer.apple.com/documentation/swift/cvalistpointer

+0

Swift.CVarArgは実際に私がクラッシュの原因となったキャストしようとしていたものです。私はこれを反映するために私の答えを編集します。 – dave234

+0

CとSwiftの間で構造体を渡したい場合は、あなたのAPIに 'UnsafeMutablePointer 'または 'COpaquePointer'で終わるでしょう。 c.f. https://modocache.io/swift-and-c。 –

+0

最後にvoid *にキャストするつもりですが、そのキャストを汎用の1つの関数に含めることを望んでいます。アイデアは、CメッセージキューへのSwiftインターフェイスを作成することです。 Cは素早いメモリを使うことができないので、「Cタイプ」の制約があることを期待していました。さもなければ、Cの型を強制するためのドキュメントに頼ることになります。 – dave234

関連する問題