Swift Generics - Общий параметр 'T' не может быть выведен - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь разработать общий метод извлечения API, но я получаю выше ошибку компиляции. После нескольких часов попыток я все еще не могу это исправить.

Тип Alias ​​

typealias RealmResponse<T> = (Int, Results<T>?, ErrorResponse?) where T:Object, T:Mappable

Объявление класса

class Profile:Object, Mappable{
}

Метод получения API

@discardableResult
func requestRealmObject<T>(endPoint:String,
                           disposeBag:DisposeBag,
                           method:HTTPMethod = .get,
                           query:[String:Any] = [:],
                           params:[String:Any] = [:]) -> Observable<RealmResponse<T>> where T:Object, T:Mappable{

    let realmResponse:Observable<ObjectResponse<T>> = APIManager.requestObject(endpoint: endPoint,
                                                                               method: method,
                                                                               query: query,
                                                                               params: params)
        .shareReplay(1)

    realmResponse
        .filter{ 200..<300 ~= $0.0 }
        .map{ response:ObjectResponse<Profile> -> [Profile] in
            if let profile = response.1{
                return [profile]
            }
            return []
        }
        .subscribe(APIManager.shared.realm.rx.add(update: true, onError: nil))
        .disposed(by: disposeBag)

    let realmObjects = APIManager.shared.realm.objects(T.self)
    return Observable.zip(realmResponse, Observable.collection(from: realmObjects)){ (response, results) in
        return (response.0, results, response.2)
    }
}

Использование

let profileObserver:Observable<RealmResponse<Profile>> = requestRealmObject(endpoint: APIManager.userProfileEndPoint,
                            disposeBag:disposeBag,
                            method: .post,
                            query:[:],
                            params:["username":loggedInUser.value])
        .shareReplay(1)

Любая помощь в этом отношении будет принята с благодарностью.

...