对于我的单元测试,我写了一个小助手,可以按名称为我获取属性值。
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)
}