Swift Array только с двумя возможными значениями - PullRequest
1 голос
/ 16 марта 2020

Я хочу создать массив, скажем, с именем nums, и я хочу, чтобы этот массив содержал значение Double или Error и ничего больше. В настоящее время я могу обойти эту проблему, создав nums следующим образом:

var nums = Array<(Double?, Error?)>()

Затем я пройду go и сделаю что-то вроде:

nums.append((5.0, nil))
nums.append((nil, Error.invalidNumber))
nums.append((10.0, nil))

Это работает, но вместо того, чтобы nums имел либо Double, либо Error, как я хочу, у него есть кортеж этих значений. Как я могу изменить создание экземпляра массива так, чтобы мне нужно было только добавить одно из значений в массив?

Моя цель - сделать это:

nums.append(5.0)
nums.append(Error.invalidNumber)
nums.append(10.0)

Ответы [ 3 ]

4 голосов
/ 16 марта 2020

Result если тип для ваших нужд. Это генерик c enum, значение которого может быть либо success(Value) (где Value равно Double для вашего случая), либо failure(Error).

var nums = [Result<Double, Error>]()

И тогда вы можете сделать :

nums.append(.success(5.0))
nums.append(.failure(Error.invalidNumber))
nums.append(.success(10.0))
1 голос
/ 16 марта 2020

То, что вы хотите, это не кортеж, а перечисление:

enum DoubleOrNothing {
    case double(Double)
    case nothing(Error)
}

Теперь это может быть только одно или другое, и «значение» - это связанное значение регистра, которым оно является. Просто создайте массив из этого enum и вы свободны дома.

enum MyError : Error {
    case invalidNumber
}

var nums = Array<DoubleOrNothing>()
nums.append(.double(5.0))
nums.append(.nothing(MyError.invalidNumber))
nums.append(.double(10.0))
0 голосов
/ 16 марта 2020

Дэвид отвечает тем, что нужно go, если все ваши ошибки одного типа. В противном случае вам нужно использовать метательные методы доступа. (A [() throws -> Double].)

var getDoubleArray = [
  { 5.0 },
  { throw Error.invalidNumber },
  { 10 }
]
...