首页 > 解决方案 > Swift ValueTransformer 旧的“好”代码现在抱怨当代 swift

问题描述

我有一个旧的简单 ValueTransformer。仅按照常规模式编写以支持 GUI 界面来编辑特定的编码文件格式。我最近有理由用当前的编译器重新生成,它正在抱怨将 Bool.self 转换为 AnyClass。是的,好的,我知道 Bool 不再是一个类(如果曾经是的话)它是一个冻结的结构。所以问题是,是否有一种 Swift 方法可以继续将此 ValueTransformer 用于结构而不是类?

我可以看到一个丑陋的解决方案,将 Bool 包装在一个类中并使用它,但充其量是糟糕的设计,但如果需要......

在不断变化的世界中,我是否遗漏了一些明显的东西?

来自编译器的投诉在transformValueClass 的单行上

    return Bool.self as! AnyClass
Cast from 'Bool.Type' to unrelated type 'AnyClass' (aka 'AnyObject.Type') always fails

class StringToBoolTransformer : ValueTransformer
{
  var boolValue : Bool?
  override func transformedValue(_ value: Any?) -> Any? {
    if let stringRep = value as? String
    {
      if stringRep.count == 1 {
        boolValue = (stringRep == "1" ? true :(stringRep == "0" ? false: nil))
      }
    }
    return boolValue
  }
  
  override func reverseTransformedValue(_ value: Any?) -> Any? {
    var boolAsString : String?
    if let boolValue = value as? Bool {
       boolAsString = boolValue ? "1" : "0"
    }
    return boolAsString
  }
  
  override class func transformedValueClass() -> AnyClass
  {
    return Bool.self as! AnyClass
  }

  override class func allowsReverseTransformation() -> Bool {
    return true
  }
  
}

标签: swift

解决方案


(NS)ValueTransformer依赖于 Objective-C 和对应的类Boolis NSNumber

我让代码更现代一点

class StringToBoolTransformer : ValueTransformer
{
  
  override func transformedValue(_ value: Any?) -> Any? {
      guard let stringRep = value as? String, 
          stringRep.count == 1,
          ["0","1"].contains(stringRep) else { return nil } 
     let boolValue = stringRep == "1"
     return NSNumber(booleanLiteral: boolValue)
  }
  
  override func reverseTransformedValue(_ value: Any?) -> Any? {
      guard let number = value as? NSNumber else { return nil }
      return number.boolValue ? "1" : "0"
  }
  
  override class func transformedValueClass() -> AnyClass
  {
      return NSNumber.self
  }

  override class func allowsReverseTransformation() -> Bool {
      return true
  }
  
}

推荐阅读