希望从“valueForKeyPath”中清除“任何”值的这个 switch 语句
Posted
技术标签:
【中文标题】希望从“valueForKeyPath”中清除“任何”值的这个 switch 语句【英文标题】:Looking to clean up this switch statement off an `Any` value from `valueForKeyPath` 【发布时间】:2017-10-03 01:09:55 【问题描述】:基本上我使用的是 KVC,并且可能返回不同的值类型,并希望根据类型创建一个 switch 语句
我在这里尝试了答案,但无法编译: Swift: Test class type in switch statement
var value: String = "Unknown"
switch node.value(forKeyPath: keyPath)
case let numberValue is NSNumber:
if numberValue == 0
value = "No"
else if numberValue == 1
value = "Yes"
case let stringValue is String:
value = stringValue
default:
break
它说
“模式变量绑定不能出现在表达式中”
和
“从 转换为不相关的 'NSNumber' 总是失败”
这里的代码对我有用:
var value: String = "Unknown"
let nodeValue = node.value(forKeyPath: keyPath)
switch nodeValue
case is NSNumber:
if let numberValue = nodeValue as? NSNumber
if numberValue == 0
value = "No"
else if numberValue == 1
value = "Yes"
case is String:
if let stringValue = nodeValue as? String
value = stringValue
default:
break
但我需要使用可选绑定来对新变量进行类型转换似乎有点不理想
有没有更好的方法来做到这一点?
【问题讨论】:
这似乎造成了另一个问题,“二元运算符不能应用于“Any?”和“NSNumber” 在进入开关之前,尝试对从您的valueForKeyPath
收到的值使用guard
。之后,您就不需要进行类型转换了。
【参考方案1】:
是一种同时进行模式匹配和强制转换的方法,我认为它实际上很干净:
switch nodeValue
case let number as NSNumber:
switch number
case 0: value = "No"
case 1: value = "Yes"
default: break
case let string as String:
value = string
default: break
【讨论】:
let value: String switch node.value(forKeyPath: keyPath) case let number as NSNumber: value = number == 0 ? "No":"Yes" case let string as String: value = string default: value = "unknown"
@LeoDabus 完全可以,只要他对数字 2 及以上的“是”而不是“未知”表示满意。
看起来像一个布尔值,所以他也可以将其转换为布尔值
它是一个布尔值,我们存储为 NSNumber :)
@AO 所以只需将其转换为 Bool【参考方案2】:
这样的东西应该可以工作
guard let unwrappedValue = node.value(forKeyPath: keyPath) else
return
switch (unwrappedValue)
case is String:
value = (unwrappedValue as! String)
case is NSNumber:
value = (unwrappedValue as! NSNumber) == 0 ? "YES" : "NO"
defualt:
value = "default value?"
【讨论】:
以上是关于希望从“valueForKeyPath”中清除“任何”值的这个 switch 语句的主要内容,如果未能解决你的问题,请参考以下文章