swift - 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
}
}
解决方案
(NS)ValueTransformer
依赖于 Objective-C 和对应的类Bool
is 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
}
}
推荐阅读
- c - 这个 ghidra 生成的伪 c 代码会生成什么?
- javascript - 错误:使用 Jest 测试 TS 时无法在模块外部使用导入
- python - Python烧瓶 - 如何制作它,因此不能在MySQL数据库中注册重复的用户名
- mysql - MySQL:有条件地使用聚合函数
- php - 在 laravel 7.30.4 中不允许此路由发布方法
- r - 在句子中找到单词 R
- reactjs - 如何将某个键盘键链接到 React JS 中的函数
- pine-script - Pinescript/Tradingview 有限迭代
- facebook-javascript-sdk - Facebook JS SDK:“如果该人在过去 90 天内使用过您的应用程序”是什么意思?
- string - 如何将 $var 的内容与 fish shell 中的已知字符串进行比较