2016-05-26 11 views
0

こんにちはthereover stackoverflowers。私は、安全なトランスポートのためのラッパーを実装しており、私はC - > Swiftの構文のいくつかに固執しています。NSDataをUnsafeMutablePointerにコピーします。<Void>

func sslReadCallback(connection: SSLConnectionRef, 
    data: UnsafeMutablePointer<Void>, 
    var dataLength: UnsafeMutablePointer<Int>) -> OSStatus 
{ 
    //let bytesRequested = dataLength.memory 
    let transportWrapper:SecureTransportWrapper = UnsafePointer(connection).memory 
    let bytesRead:NSData = transportWrapper.readFromConnectionFunc(transportWrapper.connection) 

    dataLength = UnsafeMutablePointer<Int>.alloc(1) 
    dataLength.initialize(bytesRead.length) 

    if (bytesRead.length == 0) 
    { 
     return OSStatus(errSSLClosedGraceful) 
    } 
    else 
    { 
     data.alloc(sizeof(bytesRead.length)) //<----compile error here 
     return noErr 
    } 
} 

私はコンパイルエラーの場所をマークしました。私は間違いのためにそれを責めません、私はここで一種の推測でした:P。 NSDataをデータにコピーしようとしています:UnsafeMutablePointer。それ、どうやったら出来るの?

コンパイルエラー:

/Users/*/SecureTransportWrapper.swift:108:9: Static member 'alloc' cannot be used on instance of type 'UnsafeMutablePointer' (aka 'UnsafeMutablePointer<()>')

おかげでトン!

================

アップデート:ここではsslReadCallbackが行うことになっているもののためのAPIドキュメントです:hereから

connection: A connection reference.

data: On return, your callback should overwrite the memory at this location with the data read from the connection.

dataLength: On input, a pointer to an integer representing the length of the data in bytes. On return, your callback should overwrite that integer with the number of bytes actually transferred.

抜粋

答えて

0

OK、あなたのコードを通過することができます:

dataLength = UnsafeMutablePointer<Int>.alloc(1) 
dataLength.initialize(bytesRead.length) 

dataLengthは、ポインタyはouが渡されると、それは関数の呼び出し側がバッファーのサイズを与えるところです。はあなたが読んだバイト数を入れたいと思っています。これを割り当てる必要はありません。既に割り当てられています。

(この例では無関係けど:(それはメモリの量に割り当てられ、その後、初期化されている)も)N(ALLOC(N)にして初期化Nが同じである必要があります)

私が何を考えて

dataLength.memory = bytesRead.length 

CのAPIを使用すると、この変数からdataバッファのサイズを取得することを述べている:あなたは、これがある(スウィフト3はpointee代わりのmemory使用しています)したいです。 dataはこのサイズにあらかじめ割り当てられます。

あなたは読み出したデータをフィット(bytesRead.length <= dataLength.memory)を確認してください、そしてちょうどすべてだ

memcpy(data, bytesRead.bytes, bytesRead.length) 

を行います。

+0

OKです。それとも、余分な問題はありますか? – hnh

+0

いいえ、あなたの答えがドキュメントに一致する限り!ありがとうございます - 私はあなたのものを正しいものとしてマークします。 –

関連する問題