ios – 如何以人类可读的形式显示OptionSet值?

前端之家收集整理的这篇文章主要介绍了ios – 如何以人类可读的形式显示OptionSet值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Swift具有OptionSet类型,它基本上将集合操作添加到C样式位标志. Apple在他们的框架中广泛使用它们.示例包括animate中的options参数(withDuration:delay:options:animations:completion :).

从好的方面来说,它可以让你使用干净的代码

  1. options: [.allowAnimatedContent,.curveEaseIn]

然而,也有一个缺点.

如果我想显示OptionSet的指定值,似乎没有一个干净的方法来做它:

  1. let options: UIViewAnimationOptions = [.allowAnimatedContent,.curveEaseIn]
  2. print("options = " + String(describing: options))

显示非常无用的消息:

options = UIViewAnimationOptions(rawValue: 65664)

其中一些位字段的文档将常量表示为二次幂值:

  1. flag0 = Flags(rawValue: 1 << 0)

但是我的示例OptionSet UIViewAnimationOptions的文档并未告诉您有关这些标志的数值的任何信息,并且从十进制数中计算出的位数并不简单.

题:

是否有一些干净的方法将OptionSet映射到选定的值?

我想要的输出将是这样的:

options = UIViewAnimationOptions([.allowAnimatedContent,.curveEaseIn])

但是,如果没有一堆杂乱的代码需要我为每个标志维护一个显示名称表,我想不出办法做到这一点.

(我对我在自己的代码中创建的系统框架和自定义OptionSet这样做感兴趣.)

Enums允许您同时拥有枚举的名称和原始值,但这些不支持使用OptionSets获得的set函数.

解决方法

这是我采用的一种方法,使用字典并迭代键.不是很好,但它确实有效.
  1. struct MyOptionSet: OptionSet,Hashable,CustomStringConvertible {
  2.  
  3. let rawValue: Int
  4. static let zero = MyOptionSet(rawValue: 1 << 0)
  5. static let one = MyOptionSet(rawValue: 1 << 1)
  6. static let two = MyOptionSet(rawValue: 1 << 2)
  7. static let three = MyOptionSet(rawValue: 1 << 3)
  8.  
  9. var hashValue: Int {
  10. return self.rawValue
  11. }
  12.  
  13. static var debugDescriptions: [MyOptionSet:String] = {
  14. var descriptions = [MyOptionSet:String]()
  15. descriptions[.zero] = "zero"
  16. descriptions[.one] = "one"
  17. descriptions[.two] = "two"
  18. descriptions[.three] = "three"
  19. return descriptions
  20. }()
  21.  
  22. public var description: String {
  23. var result = [String]()
  24. for key in MyOptionSet.debugDescriptions.keys {
  25. guard self.contains(key),let description = MyOptionSet.debugDescriptions[key]
  26. else { continue }
  27. result.append(description)
  28. }
  29. return "MyOptionSet(rawValue: \(self.rawValue)) \(result)"
  30. }
  31.  
  32. }
  33.  
  34. let myOptionSet = MyOptionSet([.zero,.one,.two])
  35.  
  36. // prints MyOptionSet(rawValue: 7) ["two","one","zero"]

猜你在找的iOS相关文章