在我的 *** 场上,我尝试了以下方法:
import UIKitclass myClass{ var fIEldOne:String? var fIEldTwo:Int? var fIEldThree:float?}var oneMyClass = myClass()oneMyClass.fIEldOne = "blah"oneMyClass.fIEldThree = 3.5var oneOtherClass = myClass()oneOtherClass.fIEldOne = "stuff"oneOtherClass.fIEldTwo = 3let aMirror = Mirror(reflecting: oneMyClass)let bMirror = Mirror(reflecting: oneOtherClass)for thing in aMirror.children{ for thing2 in bMirror.children { if thing.label! == thing2.label! { print("property: \(thing.label!)") print("before: \(thing.value)") print("after: \(thing2.value)") print("") //let myTest = thing.value == nil ? "nil" : "not nil" } }}
它会生成以下输出:
property: fIEldOnebefore: Optional("blah")after: Optional("stuff")property: fIEldTwobefore: nilafter: Optional(3)property: fIEldThreebefore: Optional(3.5)after: nil
如您所见,预期属性显示为“nil”.但是,如果取消注释let语句,则会收到错误消息:
playground52.swift:37:38: error: value of type 'Any' (aka 'protocol<>') can never be nil,comparison isn't allowed
然而,我们从输出中知道它是零.这怎么可能,我该怎么办呢?
解决方法 那看起来像某种BUG.看那个let x = childMirror.value == nil ? "Nil" : "Not Nil" //dont compile.let y = { (value:Any?) in return value == nil ? "Nil" : "Not Nil"}let z = y(childMirror.value) //compile,but doesn't evaluate.
我猜问题是因为Any可以存储一个Optional,但不能包含一个.试试这个:
func getValue(unkNownValue:Any) -> Any { let value = Mirror(reflecting: unkNownValue) if value.displayStyle != .Optional || value.children.count != 0 { return "Not Nil" } else { return "Nil" }}总结
以上是内存溢出为你收集整理的快速反射导致任何不可能的零值全部内容,希望文章能够帮你解决快速反射导致任何不可能的零值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)