Быстрое приведение Any к RangeExpression - PullRequest
0 голосов
/ 09 марта 2020

У меня есть словарь, который [String:Any], и я должен иметь возможность проверить, является ли Any выражением RangeExpression. Я хочу иметь возможность передавать в любой тип диапазона, ClosedRange, Range ... (1..2, 1 .. <5) </p>

if let range = options["Range"] as? RangeExpression {

}

Я получаю ошибку Protocol 'RangeExpression' can only be used as a generic constraint because it has Self or associated type requirements

Возможно ли это? Или другой подход, который я должен использовать?

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Из вашего комментария

Я пытаюсь проверить коды состояния, возвращаемые из ответа HTTP

Я предполагаю, что в некоторых последующих частях вашего кода вы собираемся сделать что-то вроде:

if range.contains(statusCode) {
    // blah blah blah
}

, если это все, что вам нужно (т.е. не использовать диапазон для индексации массива), вы можете попытаться создать стертый AnyRange тип, подобный этому:

struct AnyRange {
    let contains: (Int) -> Bool

    init<T: RangeExpression>(_ range: T) where T.Bound == Int {
        contains = range.contains
    }
}

Когда вы вводите значения в свой словарь, сделайте что-то вроде этого:

let options: [String: Any] = ["Range": AnyRange(200..<300)]

И затем вы можете привести каждый диапазон к AnyRange:

if let range = options["Range"] as? AnyRange {
    if range.contains(statusCode) {
        // blah blah blah
    }
}

Судя по всему, вы, кажется, храните вещи разных типов в одном словаре. Это хорошая возможность для создания структуры:

struct Options {
    let range: AnyRange

    // put other stuff you want to store here...
}

Таким образом, вам не нужно приведение. Все строго набрано.

0 голосов
/ 09 марта 2020

Рассматривали ли вы использование RangeExpression в качестве общего ограничения c? Например:

func takeRange<T: RangeExpression>(with dict: [String: T]) {
  if let range = dict.first?.value {
     print(range)
  }
}

Range может затем использоваться в любом месте, где требуется RangeExpression.

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