我将编写一个具有默认扩展的小型协议,该协议可以决定是否设置了所有参数。(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
}
}
问题出在孩子的类型上,即:
typealias Child = (label: String?, value: Any)
所以我不能只检查它是否为零,因为它不是可选的。如果使用print($1.value)
,它会打印出nil,所以这背后一定有一些指针魔法。
有没有关于如何检查内存地址的想法。或者可以用一些更简单的方法来实现此功能
好的,从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)
}
}
}
}