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()期望 a 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

这是 Swift 3 beta 6 的更新版本,与 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 回答