希望从“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 语句的主要内容,如果未能解决你的问题,请参考以下文章

valueForKeyPath常用用法

妙用valueForKeyPath

valueForKeyPath

valueForKey与valueForKeyPath 区别

核心数据 valueForKeyPath 返回 0

ValueForKeyPath() 返回意外的东西