繁体   English   中英

用于Value(Structures)类型的Swift协议扩展

[英]Swift protocol extensions for Value(Structures) types

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给我一个如下的编译错误。 对于值类型,如何克服这个问题? 感谢您的建议。

在此处输入图片说明

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

考虑另一种存储与结构一起使用的errorInfo方法。 为什么没有它作为结构的属性?

...给我一个如下的编译错误。 对于值类型,如何克服这个问题?

您无法克服编译器错误。 您正在尝试将苹果与橙子混合。 根据定义, objc_getAssociatedObject是Objective-C。 但是Objective-C对Swift结构一无所知。 它不可能看到他们。 它唯一知道的是它所谓的对象 -即类及其实例。 要使用Swift结构,您完全不能使用Objective-C运行时:您必须完全在Swift本身内进行操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM