2016-07-03 4 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 расширения протокола для Value (структуры) типы

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

ответ

0

По мере того как сообщение об ошибке, указывающее, objc_getAssociatedObject(_:_:) и objc_setAssociatedObject(_:_:_:_:) требуют AnyClass в качестве первого аргумента. Вы не можете использовать структуры Swift как AnyClass.

Подумайте о другом способе хранения errorInfo, который работает с структурами. Почему у вас нет свойства struct?

0

... дает мне ошибку компиляции, как показано ниже. В случае типов значений, как преодолеть эту проблему?

Вы не можете преодолеть ошибку компилятора. Вы пытаетесь смешивать яблоки с апельсинами. objc_getAssociatedObject, по определению, Objective-C. Но Objective-C ничего не знает о структурах Swift; он не может их увидеть. Единственное, о чем он знает, это то, что он называет объектами - то есть классы и их экземпляры. Чтобы работать со структурой Swift, вы не можете использовать время выполнения Objective-C: вы должны полностью работать в самой Swift.