我有:
let value: Any? = myObject[keyPath: myParamKeyPath]
myParamKeyPath
是一个String?
类型。
当myParam
应该为nil
时,我有:
value == nil
返回false
(value as? String?) == nil
返回true
是否可能在不必先将其转换为String?
的情况下检查value
是否等于nil
?比如将其与NSNull
进行比较之类的操作吗?
另外,我无法直接将value
类型更改为String?
,因为它还用于我的代码中的其他类型。
编辑:
(value as? String?) == nil
返回true
实际上是不相关的。但我仍然可以打印由keypath指向的值,它实际上将是nil
。所以我仍然不明白为什么value == nil
返回false
,而我期望它是true
...
带有更多代码的EDIT2:
let setting = appSettings.settings[indexPath.row]
let value = appSettings[keyPath: setting.keyPath]
let fontAwesome: FontAwesome
switch setting.keyPath {
case \PrinterSettings.printableImageIDs:
fontAwesome = blablabla
case \WeatherSettings.lockscreenImageIDs:
fontAwesome = blablabla
default:
if let value = value as? FakeButtonPlacementSubSettings {
fontAwesome = blablabla
} else {
fontAwesome = value != nil ? .checkSquareO : .squareO
}
}
我期望得到的是
fontAwesomeIcon = .squareO
,但当myObject[keyPath: myParamKeyPath]
的值为String?
时,我得到了checkSquareO
(它在稍后的另一个值为Bool?
的情况下也是如此)。我一定是在某个地方错过了什么...编辑3截图:
![Screenshot](https://istack.dev59.com/CHpHO.webp)
以下是有关我的项目当前设计的两张照片:
![User model](https://istack.dev59.com/WOZd6.webp)
![Setting usecase](https://istack.dev59.com/AEV1O.webp)
简而言之:我有一个包含许多设置(不止截图中的设置)的用户类,这些设置可以是多种类型(还有一些自定义类型)。
另一方面,我创建了大约10个“设置编辑器视图控制器”:每种设置都有一个。我想使用相同的设置编辑器VC来编辑同一类型的每个设置。
例如,如果要编辑的设置是布尔值,则希望使用“布尔编辑器VC”,并通过用户的新选择来编辑所选设置。这就是我使用KVO系统的原因。如果你们有更好的解决方案,我不想继续使用它。这也会消除我的Any? == nil问题。
value
不能被强制类型转换为字符串(即无法将其转换为字符串),那么(value as? String) == nil
会返回true,因此它可以是nil,也可以是整数,这都是正确的。 如果value == nil
确实为真,则应该为真,否则value
中就包含了某些内容。我建议您设置一个断点,在调试器中检查它实际包含的内容。 - Upholder Of Truthlet value = myObject[keyPath: myParamKeyPath]
。如果之后我加了if let value = value
,它实际上会进入这个if语句,然后我的value就变成了一个Any
,这真的很奇怪,因为它背后其实是一个String?
。 - TullebOptional(nil)
,这意味着你肯定在查看一个String??
值。 - RobAny?
有多么混乱,如果它出现了,你必须尽快避免使用并转换为更具体的类型。Optional
本身就是类型Any
,而且任何类型都可以隐式地提升为其自身的Optional
。这意味着Any
、Any?
、Any??
、Any???
等都是可互换的,并且可以轻松地进行提升。一旦涉及到Any?
,整个类型系统就会失效。appSettings
是什么类型?有没有任何方法可以避免它的值成为Any
? - Rob NapierappSettings
解决什么问题?我怀疑有更符合 Swift 风格的解决方法。你需要在那个switch
中特别处理一些事情,这强烈暗示了这里存在设计问题。看着代码,我怀疑你真正想要的是一个带有关联值的枚举,而不是as?
强制转换。 - Rob Napier