2017-08-30 77 views
1

嗨我想確保一個函數只接受特定的類作爲類中的泛型。無法將類型'GenericClass <Class>'的值轉換爲預期參數類型'GenericClass <Class>?'

所以我這樣做:

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 GET的子類爲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)

我必須使用子類,所以我肯定知道,在功能requestT有初始化器T(_ json: [String: Any])

BUT :當我嘗試編譯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>(liveData: LiveData<T>?, arrayLiveData: LiveData<[T]>?, callback: (([String: Any]) ->())?)

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

,一切工作正常

相關問題