反思和类型检查选项
发布时间:2020-12-14 04:30:06 所属栏目:百科 来源:网络整理
导读:玩 swift 2.0中的反射我正在尝试键入检查子值. 问题:任何项目的镜像中的子数组的每个元素都不是可选的,但是他的类型可以是可选的……当然,即使值为nil,我也会有子值 也许它不清楚,所以我在这里放一些代码来解释更好. 为方便起见,我在Mirror扩展中定义了一个
玩
swift 2.0中的反射我正在尝试键入检查子值.
问题:任何项目的镜像中的子数组的每个元素都不是可选的,但是他的类型可以是可选的……当然,即使值为nil,我也会有子值 也许它不清楚,所以我在这里放一些代码来解释更好. 为方便起见,我在Mirror扩展中定义了一个下标,用于获取具有给定标签的子对象 extension Mirror { public subscript(key: String)->Child?{ var child = children.filter { var valid = false if let label = $0.label { valid = label == key } return valid }.last if child == nil,let superMirror = superclassMirror() { child = superMirror[key] } return child } } 完美,现在让我说我有这个课程 class Rule: NSObject,AProtocol { var hello: String? var subRule: Rule? } 好的,现在问题 let aRule = Rule() let mirroredRule = Mirror(reflecting:aRule) if let child = mirroredRule["subRule"] { //child.value always exists //i can't do child.value is AProtocol? because child.value is not optional //child.value is AProtocol of course returns false //child.dynamicType is Optional(Rule) if let unwrapped = unwrap(child.value) where unwrapped is AProtocol { //This of course works only if child.value is not nil //so the unwrap function returns an unwrapped value //this is not a definitive solution } } child.value尚未初始化,所以它是nil,我无法使用unwrap函数检查他的类型.我正在编写一个反序列化器,所以我需要检查var是否为nil,因为在字典中将用于反序列化,它可以被定义. private func unwrap(subject: Any) -> Any? { var value: Any? let mirrored = Mirror(reflecting:subject) if mirrored.displayStyle != .Optional { value = subject } else if let firstChild = mirrored.children.first { value = firstChild.value } return value } 我希望问题很清楚.有什么建议? 解决方法
基于
this answer,我建议使用if case Optional< Any> .some(_).
我最近做了一些事情,以确保我的结构上至少有一个可选集.你可以粘贴到游乐场: struct ErrorResponse: Codable { let message: String? let authorizationException: [String: String]? let validationException: String? let generalException: String? var isValid: Bool { var hasAtLeastOneNonNilErrorValue = false Mirror(reflecting: self).children.forEach { if case Optional<Any>.some(_) = $0.value { hasAtLeastOneNonNilErrorValue = true } } return hasAtLeastOneNonNilErrorValue } } let errorTest = ErrorResponse(message: "some message",authorizationException: nil,validationException: nil,generalException: nil) let errorTest2 = ErrorResponse(message: nil,generalException: nil) print("is valid: (errorTest.isValid)") //is valid: true print("is valid: (errorTest2.isValid)") //is valid: false (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |