值(结构)类型

时间:2016-07-03 16:52:06

标签: swift swift-protocols

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给出了如下编译错误。在值类型的情况下,如何克服这个问题?感谢你的建议。

enter image description here

2 个答案:

答案 0 :(得分:0)

正如错误消息所示,objc_getAssociatedObject(_:_:)objc_setAssociatedObject(_:_:_:_:)需要AnyClass作为第一个参数。您不能将Swift结构用作AnyClass

想一想存储与结构一起使用的errorInfo的另一种方法。 为什么不把它作为结构的属性?

答案 1 :(得分:0)

  

...给我一个编译错误,如下所示。在值类型的情况下,如何克服这个问题?

您无法克服编译错误。你想把苹果和橘子混合在一起。根据定义,objc_getAssociatedObject是Objective-C。但Objective-C对Swift结构一无所知;它不可能看到它们。它唯一知道的是它所谓的 objects - 即类及其实例。要使用Swift结构,您根本不能使用Objective-C运行时:您必须完全在Swift内部运行。