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