2

Objective-C に次のコードがあります。

- (double)readDouble
{
    double value = 0.0;

    if ([self read:(uint8_t *)&value maxLength:8] != 8)
    {
        NSLog(@"***** Couldn't read double");
    }

    return value;
}

できます。しかし、それをSwiftに変換する方法がわかりません。これが私のコードです:

public func readDouble() -> Double {

    var value : Double = 0.0

    var num = self.read((uint8_t *)&value, maxLength:8) // got compiling error here!
    if num != 8 {

    }
}

エラーメッセージは次のとおりです。

タイプ「($T4, maxLength: IntegerLiteralConvertible)」の引数リストで「&」を呼び出すことはできません

誰でも助けることができますか?ありがとう

私が使用しているテストデータ(1.25):

14 AE 47 E1 7A 14 F4 3F

アップデート:

シンプルなcソリューションですが、Swiftでこれを行うにはどうすればよいですか?

double d = 0;
unsigned char buf[sizeof d] = {0};

memcpy(&d, buf, sizeof d);
4

3 に答える 3

3

これはうまくいくはずです:

let num = withUnsafeMutablePointer(&value) {
    self.read(UnsafeMutablePointer($0), maxLength: sizeofValue(value))
}

説明:のアドレスに設定されwithUnsafeMutablePointer()た唯一の引数 ($0簡略表記) を使用してクロージャ (ブロック) を呼び出しますvalue

$0は型UnsafeMutablePointer<Double>を持ち、最初の引数としてread()an を想定し ているため、別の変換が必要です。UnsafeMutablePointer<UInt8>次に、クロージャの戻り値が に割り当てられnumます。

于 2014-09-15T10:36:03.893 に答える
1

Swift 2を使用して上記の方法は機能しませんが、この変換を行うためのはるかに簡単な方法を発見しました。

func binarytotype <T> (value: [UInt8], _: T.Type) -> T
{
    return value.withUnsafeBufferPointer
    {
        return UnsafePointer<T>($0.baseAddress).memory
    }
}

func typetobinary <T> (var value: T) -> [UInt8]
{
    return withUnsafePointer(&value)
    {
        Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>($0), count: sizeof(T)))
    }
}

let a: Double = 0.25
let b: [UInt8] = typetobinary(a) // -> [0, 0, 0, 0, 0, 0, 208, 63]
let c = binarytotype(b, Double.self) // -> 0.25

プレイグラウンドで Xcode 7.2 でテストしました。

于 2016-02-02T19:50:33.690 に答える
0

Martin に感謝します。

func binarytotype <T> (_ value: [UInt8], _ : T.Type) -> T
{
    return value.withUnsafeBufferPointer
    {
        UnsafeRawPointer($0.baseAddress!).load(as: T.self)
    }
}

func typetobinary <T> (_ value: T) -> [UInt8]
{
    var v = value
    let size = MemoryLayout<T>.size
    return withUnsafePointer(to: &v)
    {
        $0.withMemoryRebound(to: UInt8.self, capacity: size)
        {
            Array(UnsafeBufferPointer(start: $0, count: size))
        }
    }    
}

let dd: Double = 1.23456             // -> 1.23456
let d = typetobinary(dd)             // -> [56, 50, 143, 252, 193, 192, 243, 63]
let i = binarytotype(d, Double.self) // -> 1.23456
于 2016-08-17T19:10:58.870 に答える