【问题标题】:How to convert bool to NSData如何将布尔转换为 NSData
【发布时间】:2016-07-21 16:45:18
【问题描述】:

我发现this post 可以将Int 转换为NSData

它说要这样做:

var foo: Int = 1000
let data = NSData(bytes: &foo, length: sizeof(Int))

我想知道,将Bool 转换为NSData 时我是否应该这样做,如下所示:

 var purchase: Bool = true
 let data = NSData(bytes: &purchase, length: sizeof(Bool))

就我而言,我一直都知道Bool 是真的。既然是这种情况,我想知道是否有更简单的方法可以将值“true”转换为 NSData 对象。

一些背景背景:

我将这个NSData 值存储在带有this library 的钥匙串中。

我还将使用NSKeyedUnarchiver.unarchiveObjectWithDataNSData 值转换回布尔值

【问题讨论】:

  • 尝试将bool转换为int,然后再转换为NSData
  • 我会将 Bool 转换为字节,而不是 int。然后只需执行NSData setBytes。由于 Bool 是有符号字符,而字符是字节,所以没有转换...只需将其转换为字节即可。
  • NSNumber(booleanLiteral: purchase) 可以将 boo 转换为数字。

标签: ios swift nsdata nskeyedunarchiver


【解决方案1】:

Swift 4 解决方案

if let isBool = value as? Bool
{
    var valueInInt = Int(NSNumber(value: isBool)) //Convert Bool to Int
    let data = Data(bytes: &valueInInt, count: MemoryLayout.size(ofValue: valueInInt) //Int to Data
}

【讨论】:

    【解决方案2】:

    Swift >= 4 解决方案

    我们可以使用JSONEncoder 轻松实现这一点,因为Bool struct 确认Codable Typealias

    let mBoolValue = true
    let boolData = try! JSONEncoder().encode(mBoolValue)
    

    【讨论】:

      【解决方案3】:

      您可以尝试使用返回 NSData 的函数来扩展 Bool

      (我现在没有 IDE,所以语法可能不对)

      extension Bool {
        func toNSData() -> NSData {
          var data: NSData?
          if ( self.value ) { //not sure if this is the right syntax
            return NSData(bytes: 1, length: sizeof(Int))
          }
          return NSData(bytes: 0, lentgh: sizeOf(Int))
        }
      }
      

      那么任何 bool 都会有这样的 NSData 表示

      let b: Bool = true
      let data: NSData = b.toNSData()
      

      我在这方面还是新手,但我认为上述内容是苹果鼓励的“面向协议编程”的一部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        • 2015-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多