簡體   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