您好我想确保函数只接受特定类作为类中的泛型。
所以我这样做了:
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
电话
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()
}
}
答案 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]>?)
一切正常