【问题标题】:how to represent a zero or nil double value in NSMutableData?如何在 NSMutableData 中表示零或零双精度值?
【发布时间】:2015-04-14 08:43:15
【问题描述】:

我有一个应该存储在外部文件中的双精度值数组。我将数组转换为 NSMutableData 并将数据保存到磁盘。

某些双精度值要么缺失 (nil),要么为零 (0.0)。 缺失值可以用 0.0 或最大双精度表示来替换。

但 Double 没有最大值(如 Int.max),并且 NSData 将 0.0 值解释为终止字节。所以每次遇到 0.0 的值,数据就结束得太快了。

var description: String {
    var output: String = ""
    for value in self
    {
        output = output + "\(value)\n"
    }
    return output
}

var count : Int { return data.length/sizeof(Double) }

func append(var value: Double)
{
    self.data.appendBytes(&value, length: self.size)
}

subscript(index: Int) -> Double?
{
    assert(index < self.count, "index exceeds bounds")
    var output : Double?
    self.data.getBytes(&output, range: NSRange(location: index * self.size, length: self.size))
    return output
}

编辑:

D'Oh,我使用 generate 打印出值,并且 GeneratorOf 在第一个 nil 值之后停止。不过,表示零值以区别于 0.0 的好方法是什么?

func generate() -> GeneratorOf<Double>
{
    var index = 0
    var count = self.counter
    return GeneratorOf<Double> {
        if index < count
        {
            return self[index++]
        }
        return nil
    }
}

edit2

它是 Double.infinity 而不是 Int.max

我现在需要醒来。

【问题讨论】:

  • “0.0 值被 NSData 解释为终止字节” – 不,NSData 根本不解释字节。
  • 那么为什么我只取回前几个值呢? ... oh... d'oh,generate 函数(SequenceType)在遇到 nil 值时终止。

标签: swift binary double nsmutabledata


【解决方案1】:

我想到的唯一解决方案是使用 NSNumber 包装双精度,这样您就可以正确处理 0.0,然后对于 nulls,您可以使用 NSNull。您没有使用NSNumber 有什么具体原因吗?

【讨论】:

  • 当原始类型可以使用时,不需要 NSNumber 的开销。
猜你喜欢
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 2012-07-23
  • 2021-10-27
  • 2016-11-06
  • 1970-01-01
相关资源
最近更新 更多