Как создать общее закрытие завершения? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть следующий протокол:

protocol RESTAPIprotocol {
    associatedtype T: Object, Decodable
}

extension RESTAPIprotocol {

    func getList(sinceSyncToken: String = "",
                 pageLimit: Int = 100,
                 progress: Moya.ProgressBlock? = nil,
                 completion:@escaping (_ list: [T]?, _ error: AppError?) -> Void) { ... }

и объект (ы):

final class RLMOrganization: RLMDefaults {
    typealias T = RLMOrganization
}

final class RLMProject: RLMDefaults {
    typealias T = RLMProject
}

final class RLMLocation: RLMDefaults {
    typealias T = RLMLocation
}

, желающий использовать его следующим образом:

class SyncEngine {

    let listCompletionClosure = { (_ list: [T]?, _ error: AppError?) -> Void in  ... }


    func syncOrganizations() {
        // Sync down from server and update our local DB.
        organizationsDAL.getList(sinceSyncToken: organizationsDAL.getLastSyncToken(), completion: listCompletionClosure)
    }

Нополучите ошибку:

enter image description here

Какой вид имеет смысл, но не понимаю, как я могу передать универсальный, используемый как часть RESTAPIprotocolв общее закрытие?

Цель состоит в том, чтобы попытаться выполнить следующее:

func syncOrganizations() {
    organizationsDAL.getList(sinceSyncToken: organizationsDAL.getLastSyncToken(), completion: listCompletionClosure)
}

func syncProjects() {
    projectsDAL.getList(sinceSyncToken: projectsDAL.getLastSyncToken(), completion: listCompletionClosure)
}

func syncLocations() {
    locationsDAL.getList(sinceSyncToken: locationsDAL.getLastSyncToken(), completion: listCompletionClosure)
}

1 Ответ

0 голосов
/ 24 сентября 2018

Как насчет изменить его на "

let listCompletionClosure = { (_ list: [RLMOrganization]?, _ error: AppError?) -> Void in  ... }

Для маркера завершения требуется конкретный тип, и вы определили T = RLMOrganization в контексте класса RLMOrganization.

Редактировать:замыкание не может быть общим, но функция может:

func listCompletion<T: Decodable>(list: [T]?, error: AppError?) {
    // you must cast `list` to a  concrete type
}

func syncOrganizations() {
    organizationsDAL.getList(sinceSyncToken: organizationsDAL.getLastSyncToken(), completion: listCompletion)
}

func syncProjects() {
    projectsDAL.getList(sinceSyncToken: projectsDAL.getLastSyncToken(), completion: listCompletion)
}

func syncLocations() {
    locationsDAL.getList(sinceSyncToken: locationsDAL.getLastSyncToken(), completion: listCompletion)
}
...