2016-07-03 3 views
0
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") 
} 

}Swift Protokollerweiterungen für Value (Strukturen) Typen

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) 
     } 
    } 
} 

Mein Ziel ist es, eine Standard-Implantation für das Protokoll KZClientResponse und Xcode haben, ist mir eine Kompilierung geben Fehler wie unten. Wie kann dieses Problem bei Werttypen behoben werden? Schätze deine Vorschläge.

enter image description here

Antwort

0

Da die Fehlermeldung anzeigt, objc_getAssociatedObject(_:_:) und objc_setAssociatedObject(_:_:_:_:) erfordern AnyClass als erstes Argument. Sie können Swift-Strukturen nicht als AnyClass verwenden.

Denken Sie eine andere Möglichkeit, errorInfo zu speichern, die mit Strukturen arbeitet. Warum haben Sie es nicht als Eigentum der Struktur?

0

... gibt mir einen Kompilierfehler wie unten. Wie kann dieses Problem bei Werttypen behoben werden?

Sie können den Compilerfehler nicht beheben. Du versuchst Äpfel mit Orangen zu mischen. objc_getAssociatedObject ist per Definition Objective-C. Aber Objective-C weiß nichts von Swift-Strukturen; es kann sie unmöglich sehen. Das einzige, was es weiß, ist, was es ruft Objekte - das heißt, Klassen und ihre Instanzen. Um mit einer Swift-Struktur zu arbeiten, können Sie die Objective-C-Laufzeit überhaupt nicht verwenden: Sie müssen vollständig innerhalb von Swift selbst arbeiten.