こんにちは私は、関数がクラス内のジェネリックとして特定のクラスを受け入れることを確認したいと思います。私は唯一のT
がJSONObject
のサブクラスであるようにしたいので、ここでタイプ 'GenericClass <Class>'の値を、予想される引数タイプ 'GenericClass <Class>'に変換できません。
func request<T: JSONObject>(liveData: LiveData<T>?, arrayLiveData: LiveData<[T]>?,
callback: (([String: Any]) ->())?,) {
...
}
:
だから私はこれをしませんでした。
ときどき動作しないことがあります。
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
取得のWELとしてサブクラスのこのサブクラスなので、私はfucctionでそれを使用することができます。
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)
私は機能request
内のすべてのT
はイニシャライザT(_ json: [String: Any])
を持っていることを確認するために私が知っているので、サブクラスを使用しましたが、 : XCodeをコンパイルしようとすると、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()
}
}
正常に動作しますか? – JeremyP
@JeremyPこのエラーが発生しました 'LiveData'型の値を期待される引数型 'LiveData 'に変換できません。 私は '要求を呼び出そうとすると(...) ' –
そして' LiveData'の宣言は何ですか – JeremyP