Как написать расширение для Result Enum - PullRequest
0 голосов
/ 11 июля 2019

Я представил результаты моих запросов API, используя Result Enum с универсальным типом, следующим образом Result<T: Resource, Error>

В некоторых случаях я не хочу обсуждать, был ли запрос успешным или нет, но мне все еще нужновернул ресурс в виде значения NULLдолжен быть объявлен для неспециализированного универсального типа 'Result' с ограничениями, указанными в предложении 'where'

Использование необъявленного типа 'T'

Ответы [ 3 ]

1 голос
/ 11 июля 2019

Запишите ограничение типа следующим образом:

enum Result<T, Error> {
    case success(T)
    case failure(Error)
}

struct Resource {
    let value: String
}

extension Result where T == Resource {
    var value: Any? {
        switch self {
        case .success(let resource):
            return resource.value

        case .failure:
            return nil
        }
    }
}
1 голос
/ 11 июля 2019

Вы можете просто сделать это, как,

enum Result<T> where T: Resource {
    case success(T)
    case failure(Error?)
}

Создайте enum Result с case success, принимая общее связанное значение типа Resource и другое case failure с Error? в качестве связанного значения .

Поскольку вы используете универсальный параметр типа Resource, я предполагаю, что Resource - это protocol с value в качестве одного из его свойств.

protocol Resource {
    var value: String {get set}
}

Теперь extension Result выглядит как

extension Result {
    var value: Any? {
        switch self {
        case let .success(resource):
            return resource.value

        case let .failure(error):
            return error
        }
    }
}

Сейчас return error в case failure и resource.value для case success.

Нет необходимости указывать универсальный параметр T с предложением where в extension снова, поскольку вы уже сделали это при определении enum Result.

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

struct R1: Resource {
    var value: String
}

let r1 = R1(value: "R1 is of type Resource")
let result = Result<R1>.success(r1)
print(result.value)
1 голос
/ 11 июля 2019

Вы можете просто создать расширение, как показано ниже,

extension Result {
    var value: Any? {
        switch self {
        case .success(let resource):
            return resource

        case .failure:
            return nil
        }
    }
}

Как и в определении enum, T всегда равно Resource, поэтому вам не нужно указывать в расширении.

Но если Resource - это некоторая protocol, и вы хотите наложить ограничение на value переменную в объявлении, вы можете указать это в расширении, используя предложение where, как показано ниже,

extension Result where T == someSubTypeOfResource {
    var value: Any? {
        switch self {
        case .success(let resource):
            return resource

        case .failure:
            return nil
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...