如何判断孩子是否为零

时间:2016-07-18 12:31:01

标签: ios swift reflection mirror

我即将编写一个带有默认扩展名的小协议,可以决定是否设置了所有参数。 (斯威夫特2.2)

我的想法是使用Mirror类型并获取给定类型的所有子元素,而不是遍历它们。像这样:

var isComplete: Bool {
    get {
        return Mirror(reflecting: self).children.reduce(true) { return $0 && $1.value != nil } // <- Error, because value is not Optional
    }
}

问题在于孩子的类型,即:

typealias Child = (label: String?, value: Any)

所以我不能检查它是否为零,因为它不是可选的。如果使用print($1.value),则打印出nil,因此必须有一些指针魔法。

任何想法如何检查那个的内存地址。或者可能是实现此功能的一种更简单的方法

1 个答案:

答案 0 :(得分:0)

好的,从https://stackoverflow.com/a/34637228/3308103

获得解决方案

重点是,我们必须再次镜像该值并获取它的子项,如果它有值,则为1。

所以解决方案很糟糕,但如果有人需要它......

public protocol OptionalValueObservable {
    var isComplete: Bool {get}
    var hasAnyProperty: Bool {get}
}

public extension OptionalValueObservable {
    var isComplete: Bool {
        get {
            return Mirror(reflecting: self).children.reduce(true) { acc, val in
                let subMirror = Mirror(reflecting: val.value)
                return acc && (subMirror.displayStyle == .Optional ? subMirror.children.count > 0 : true)
            }
        }
    }

    var hasAnyProperty: Bool {
        get {
            return Mirror(reflecting: self).children.reduce(false) { acc, val in 
                 let subMirror = Mirror(reflecting: val.value)
                 return acc || (subMirror.displayStyle == .Optional ? subMirror.children.count > 0 : true)
            }
        }
    }
}