ios - 如何判断 child 是否为零

标签 ios swift reflection mirror

我即将编写一个带有默认扩展的小协议(protocol),它可以决定是否设置所有参数。 ( swift 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
    }
}

问题出在 child 的类型上,即:

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

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

任何想法如何检查它的内存地址。或者也许是一些更简单的方法来实现此功能

最佳答案

好的,从 https://stackoverflow.com/a/34637228/3308103 得到了解决方案

关键是,我们必须再次镜像值并获取它的子项,如果它有值,则计数为 1。

所以解决方案是 hacky,但如果有人需要它......

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)
            }
        }
    }
}

关于ios - 如何判断 child 是否为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38436785/

相关文章:

ios - SwiftUI List didSelect 就像在 UITableView 中一样

iphone - objective-c 中的可缩放按钮

ios - 当图像是 UITabBar 的选择时使用原始图像颜色的优雅方法

java - 如何使用静态方法(不带异常)获取类的名称

c# - 如何使用反射生成直接调用包装器字节码?

ios - 如何自定义 UITextField?

iOS 在完成之前停止 animateWithDuration

ios - 根据维护顺序快速解析json

ios - xcode 7 中 UIControlStateEvents 的新语法是什么?

Java/Android 从字符串 WITH Value 调用方法