Swift2 反射帮助.将我得到的值(键入 Any?)转换为布尔值或布尔值?因此



对于我的单元测试,我写了一个小助手,可以按名称为我获取属性值。

let m = Mirror(reflecting: self)
let child1 = m.descendant(name)

现在的问题是孩子有 Any 类型? 但属性实际类型是例如布尔?所以任何实际上都是可选的!

这就是为什么if child1 is Bool?从不开火,因为任何?不是布尔?。
但是child1! is Bool?不会编译。
child1! is Bool不是真的!

那么我如何"拆箱"这反映了任何?值?


我的意思的一个小例子

import UIKit
class ViewController: UIViewController {
    let name = "asd"
    let boolvalue: Bool = true
    var optboolvalue: Bool? = true
    override func viewDidLoad() {
        print( getNumberForBool("boolvalue") )
        print( getNumberForBool("optboolvalue") )
    }
    func getNumberForBool( name: String ) -> NSNumber {
        let m = Mirror(reflecting: self)
        let child1 = m.descendant(name)
        if(child1 != nil) {
            //! only works for bool, not for bool?
            if let b = child1  as? Bool {
                return NSNumber(bool: b)
            }
            //this would be my interpretation of how to do it ... unwrap the any and unwrap it again. this doesn't compile though :)
//            if let b = child1! as! Bool? {
//                return NSNumber(bool: b!)
//            }
        }
        return NSNumber(bool: false)
    }
}

注意

案例布尔的子项类型1?

▿ 可选(

可选(真(( ▿ 部分 : 可选(真( - 一些 : 真

解决方案

我解决了无法再次使用反射将布尔转换为布尔

的问题
        if let any = child1, let maybeB = Mirror(reflecting: any).descendant("Some") as? Bool {
            if let b = (maybeB as Bool?) {
                return NSNumber(bool: b)
            }
        }

反射 ^ 2 :D

完整要点:

https://gist.github.com/Daij-Djan/18e8ab9bcbaa3f073523

??运算符在内部有Some的情况下解开可选包。如果没有,则在 eg 之后传递的值。 let foo = someOptional ?? alternativeValue .

这会给你一个解开包装的Any.由于 Swift 是强类型的,因此只有在投射时,您才会获得布尔值。

if let b = child, let c = b as? Bool {
       return NSNumber(bool: c)
}

相关内容

  • 没有找到相关文章