【问题标题】:Convert NSTimeInterval to NSData and back to NSTimeInterval将 NSTimeInterval 转换为 NSData 并返回 NSTimeInterval
【发布时间】:2015-11-11 14:56:10
【问题描述】:

如何将NSTimeInterval 值转换为NSData

【问题讨论】:

  • 为什么需要这样做?
  • 向一个同伴发送我向他发送邀请的时间,以查看谁先发送了它(多点连接),我遇到一个问题,即当 2 个同伴在每个人收到邀请之前相互发送邀请时对方发给他们的邀请,所以双方都认为他们是发送者而不是接收者。
  • 所以您希望两个设备的时间设置正确,以便进行比较?发送一个您可以轻松归档的 NSDate
  • 那么如何将 NSDate 转换为 NSData?
  • 发布了一个用 Xcode 7 和 Swift 2.0 测试的答案。如果您使用的是其他版本的 Swift 并且这不起作用,请告诉我。

标签: swift nsdata nstimeinterval


【解决方案1】:

Xcode 8.3.1 • Swift 3.1

var nowInterval = Date().timeIntervalSince1970                                  // 1491800604.362141
let data = Data(bytes: &nowInterval, count: MemoryLayout<TimeInterval>.size)    // 8 bytes
let timeInterval: Double = data.withUnsafeBytes{ $0.pointee }

let date = Date(timeIntervalSince1970: timeInterval)   // Apr 10, 2017, 2:03 AM"

【讨论】:

    【解决方案2】:

    您也可以使用NSKeyedArchiver:

        let time = NSTimeInterval(100)
    
        let archivedTime = NSKeyedArchiver.archivedDataWithRootObject(time)
        let unarchivedTime = NSKeyedUnarchiver.unarchiveObjectWithData(archivedTime) as! NSTimeInterval
    

    【讨论】:

    • 这不是最好的解决方案,因为unarchiveObjectWithData 会引发异常。但是因为这个方法没有“抛出”它的异常,所以没有办法用 Swift 来捕捉它,这可能会导致你的应用程序崩溃。
    【解决方案3】:

    NSTimeInterval 只是Double 的类型别名。您可以通过复制字节来归档它,就像使用任何其他 Foundation 类型一样。

    var time = NSTimeInterval(100) // 100.0
    
    let timeData = NSData(bytes: &time, length: sizeof(NSTimeInterval))
    
    var unarchivedTime = NSTimeInterval() // You need to initialize an empty NSTimeInterval object as a var in order to mutate it
    
    timeData.getBytes(&unarchivedTime, length: sizeof(NSTimeInterval))
    
    print(unarchivedTime) // 100.0
    

    【讨论】:

    • 这不适用于 XCode 7.2 等...不会接受“&”,然后在删除后抛出关于强制转换为 UnsafePointer 的错误。
    • @DanShev 在 Xcode 7.2 i.stack.imgur.com/dNhdk.png 的 Swift iOS Playground 中为我工作得很好。您可以发布调用此代码的完整上下文吗?
    猜你喜欢
    • 2012-02-29
    • 1970-01-01
    • 2014-10-27
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多