C# преобразование универсального c компонента Swift - PullRequest
0 голосов
/ 09 марта 2020

Я запустил C#, и мне было интересно, есть ли такая же функциональность языка, как в Swift.

Универсальная функция декодирования c для преобразования Json данных ответов в экземпляры объектов модели, где типы соответствуют к декодируемому протоколу.

public func decode<T: Decodable>(data: Data, result: @escaping (Result<T>) -> Void) {
    do {
        let results = try jsonDecoder.decode(T.self, from: data)
        DispatchQueue.main.async {
            result(.success(results))
        }
    } catch let error {
        // handle error
    }
}

Пример объекта пользователя, декодируемый. (Пожалуйста, игнорируйте тип объекта, связанный с RealmSwift)

class User: Object, Decodable {

    @objc dynamic var _id: String = ""
    @objc dynamic var uid: String = ""
    @objc dynamic var email: String?
    @objc dynamic var phoneNumber: String?
    @objc dynamic var isAnonymous = true

    override static func primaryKey() -> String? {
        return "uid"
    }
}

Так что либо блок обратного вызова сети, либо тестовая функция вызывает декодирование.

Например,

func performRequest<T: Decodable>(request: inout URLRequest, result: @escaping (Result<T>) -> Void) -> URLSessionDataTask {

    let dataTask = session.dataTask(with: request) { [weak self] data, response, error in
        defer { self?.dataTask = nil }

        if let data = data,
            let response = response as? HTTPURLResponse {

            if response.statusCode == 200 {
                self?.decode(data: data, result: result)
            } else {
                // handle status code
            }
        } else if let error = error as NSError? {
            // handle error
        }
    }

    dataTask.resume()
    return dataTask
}

Затем часть generi c завершается определением интерфейса, например,

func register(uid: String,
              isAnonymous: Bool,
              result: @escaping (Result<User>) -> Void) {

    var request = requestFactory.register(uid: uid, isAnonymous: isAnonymous)
    if let urlString = request.url?.absoluteString {
        cancelExistingTask(urlString: urlString)
        dataTask = performRequest(request: &request, result: result)
        dataTasks[urlString] = dataTask
    }
}

Как это будет выглядеть в C# и есть ли лучший способ сделать это в C# с его языковыми функциями?

...