如何解决来自镜像自省的孩子的价值不再符合协议
我试图了解swift的变形能力。
我有一个父类Passport
,其子类(User
)实现了一个协议Clonable
,但是当自省子级值时,它无法通过检查child.value is Clonable
。
有人可以解释吗?
extension Clonable {
func clone() -> Self? {
if let me = self as? SimpleInit {
let new = type(of: me).init()
let mirror = Mirror(reflecting: self)
for child in mirror.children {
if let kp = child.label,let new = new as? NSObject {
if child.value is Clonable,let value = child.value as? Clonable { // this should be true
print("cloning \(child.value) for keypath \(kp)")
new.setValue(value.clone(),forKeyPath: kp)
} else {
print("not cloning \(child.value) for keypath \(kp)")
new.setValue(child.value,forKeyPath: kp)
}
}
}
return new as? Self
}
return nil
}
}
class Passport: NSObject,Clonable,SimpleInit,Customreflectable {
var customMirror: Mirror {
return Mirror(self,children: ["user": user])
}
@objc var user: User?
required override init() {
}
func printMe() {
user?.printMe()
}
}
class User: NSObject,children: ["name": name])
}
@objc var id: Int
@objc var name: String?
required override init() {
print("init user")
id = Int(arc4random())
}
func printMe() {
print("id \(id) name \(name)")
}
}
let passport = Passport()
passport.user = User()
passport.user?.name = "John"
let clone = passport.clone()
passport.printMe()
clone?.printMe()
这是输出:
init user // should be called second time when user gets cloned.
not cloning Optional(<__lldb_expr_92.User: 0x6000039d6420>) for keypath user
id 2046302380 name Optional("John")
id 2046302380 name Optional("John")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。