2017-08-30 11 views
1

こんにちは私は、関数がクラス内のジェネリックとして特定のクラスを受け入れることを確認したいと思います。私は唯一のTJSONObjectのサブクラスであるようにしたいので、ここでタイプ '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() 
    } 
} 
+0

正常に動作しますか? – JeremyP

+0

@JeremyPこのエラーが発生しました 'LiveData '型の値を期待される引数型 'LiveData 'に変換できません。 私は '要求を呼び出そうとすると(...) ' –

+0

そして' LiveData'の宣言は何ですか – JeremyP

答えて

0

YEEEAY、 助けた何推測。

request関数のパラメータを並べ替える。

ジェネリック型が最初のパラメータである場合、コンパイラに問題があるようです。

だけ

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

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

を変更し、すべてのものは、特に間違って、いつ何が起こっ

関連する問題