将Objective-C方法转换为Swift for NSInputStream(将字节转换为double)

时间:2014-09-15 10:09:12

标签: ios swift nsinputstream

我在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);

3 个答案:

答案 0 :(得分:3)

这应该有效:

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

解释withUnsafeMutablePointer()使用唯一参数调用闭包(块) ($0以简写表示法)设置为value的地址。

$0的类型为UnsafeMutablePointer<Double>read()需要 UnsafeMutablePointer<UInt8>作为第一个参数,因此是另一个转换 有必要的。然后将闭包的返回值分配给num

答案 1 :(得分: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测试了它。

答案 2 :(得分:0)

以下是Swift 3 beta 6的更新版本,与Martin相比有所不同。

StageService