public struct KZErrorInfo: Unboxable {
var statusCode = -1
var status: String?
var errorMessage: String?
public init() {
}
public init(unboxer: Unboxer) {
self.statusCode = unboxer.unbox("StatusCode")
self.status = unboxer.unbox("Status")
self.errorMessage = unboxer.unbox("Message")
}
}
protocol KZClientResponse: ETClientResponse {
var errorInfo: KZErrorInfo? { get set }
}
var errorInfo: KZErrorInfo? {
get {
if let value = objc_getAssociatedObject(self, &xoAssociationKeyErrorInfo) as? KZErrorInfo {
return value
}
return nil
}
set(newValue) {
if let error = newValue {
objc_setAssociatedObject(self, &xoAssociationKeyErrorInfo, error, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
}
}
我的目标是对协议KZClientResponse进行默认植入,Xcode给出了如下编译错误。在值类型的情况下,如何克服这个问题?感谢你的建议。
答案 0 :(得分:0)
正如错误消息所示,objc_getAssociatedObject(_:_:)
和objc_setAssociatedObject(_:_:_:_:)
需要AnyClass
作为第一个参数。您不能将Swift结构用作AnyClass
。
想一想存储与结构一起使用的errorInfo
的另一种方法。
为什么不把它作为结构的属性?
答案 1 :(得分:0)
...给我一个编译错误,如下所示。在值类型的情况下,如何克服这个问题?
您无法克服编译错误。你想把苹果和橘子混合在一起。根据定义,objc_getAssociatedObject
是Objective-C。但Objective-C对Swift结构一无所知;它不可能看到它们。它唯一知道的是它所谓的 objects - 即类及其实例。要使用Swift结构,您根本不能使用Objective-C运行时:您必须完全在Swift内部运行。