【问题标题】:How to decide whether a child is nil or not如何判断一个孩子是不是零
【发布时间】:2016-07-18 12:31:00
【问题描述】:

我即将编写一个带有默认扩展名的小协议,它可以决定是否设置了所有参数。 (斯威夫特 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)怎么样?它可能会为您提供有关指针的一些信息,但它肯定是 hacky。 (1)swiftdoc.org/v2.2/func/unsafeAddressOf/…
  • 当然可以,但不幸的是,这需要它的参数是 AnyObject,我只有 Any,所以它不适用于 if let someObject = $1.value as? AnyObject { let somePointer = unsafeAddressOf(someObject) } 的事件,因为大多数属性都是值类型。

标签: ios swift reflection mirror


【解决方案1】:

好的,从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)
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 2011-01-04
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 2015-03-01
    相关资源
    最近更新 更多