无法将'GenericClass <class>'类型的值转换为预期的参数类型'GenericClass <class>?'

时间:2017-08-30 09:58:55

标签: swift generics swift3

您好我想确保函数只接受特定类作为类中的泛型。

所以我这样做了:

func request<T: JSONObject>(liveData: LiveData<T>?, arrayLiveData: LiveData<[T]>?, 
    callback:  (([String: Any]) -> ())?,) {
    ...
}

所以在这里我只想允许T成为JSONObject的子类。

有时它有时不起作用。

JSONObject.swift:

class JSONObject: NSObject, NSCoding {
    internal var json: [String: Any]

    required init?(_ json: [String: Any]) {
        self.json = json
        super.init()
    }
    override init() {
        fatalError("Not implemented")
    }

    func encode(with coder: NSCoder) {
        coder.encode(self.json)
    }
    required init?(coder decoder: NSCoder) {
        fatalError("Must be overwritten")
    }
    class func decodeJSON(_ decoder: NSCoder) -> [String: Any] {
        return decoder.decodeObject() as! [String: Any]
    }
}

子类: Content.swift

class Content: JSONObject {
    // MARK: Properties

    // MARK: Initialization
    required init?(_ json: [String : Any]) {
        super.init(json)
    }

   required convenience init?(coder decoder: NSCoder) {
        self.init(JSONObject.decodeJSON(decoder))
    }
}

并且这个JSONObject的子类也被子类化了,所以我可以在功能中使用它。

class Playlist: Content {
    required init?(_ json: [String : Any]) {
        super.init(json)
    }

    required convenience init?(coder decoder: NSCoder) {
        self.init(JSONObject.decodeJSON(decoder))
    }

}

我这样称呼函数:

request(liveData: LiveData<Playlist>(), arraryLiveData: nil, callback: nil)

我必须使用子类化,因此我确信函数T中的每个request都有初始值T(_ json: [String: Any])

但是:当我尝试在request电话

上编译XCode投诉时

Cannot convert value of type 'LiveData<Playlist>' to expected argument type 'LiveData<JSONObject>?'

LiveData.swift

class LiveData<T> {

   private var senderId: String
   private var value: T?
   private var observers: [LiveDataObserver]

   init(senderId: String) {
       self.senderId = senderId
       self.observers = []
   }

   func getValue() -> T? {
       return value
   }

   func setValue(_ value: T) {
       self.value = value
       notifyObservers()
   }

   func sendError(_ error: LiveDataError) {
       for observer in observers {
          observer.errorOccurred(senderId, error)
       }
   }

   func sendError(_ string: String) {
       sendError(liveDataError(from: string))
   }

   private func notifyObservers() {
       for observer in observers {
           observer.valueChanged(senderId, value)
       }
   }

   func observe(observer: LiveDataObserver) {
       observers.append(observer)
       // Send initial value if value is present
       if value != nil {
           observer.valueChanged(senderId, value)
       }
   }

   func hasObservers() -> Bool {
       return observers.count > 0
   }

   func removeObservers() {
       observers.removeAll()
   }
}

1 个答案:

答案 0 :(得分:0)

YEEEAY, 猜猜有什么帮助。

重新排序request函数的参数。

当泛型类型是第一个参数时,编译器似乎遇到了问题。

只需更改

request<T: JSONObject>(liveData: LiveData<T>?, arrayLiveData: LiveData<[T]>?, callback: (([String: Any]) -> ())?)

request<T: JSONObject>(callback: (([String: Any]) -> ())?, liveData: LiveData<T>?, arrayLiveData: LiveData<[T]>?)

一切正常