Шаблон привязки значений со структурами Swift - PullRequest
0 голосов
/ 19 января 2019

Как описывает книга Programming Swift , кортежи могут быть деструктурированы либо в присваивании, либо путем привязки значения в switch

let point = (3, 2)
switch point {
case let (x, y):
    print("The point is at (\(x), \(y)).")
}
let (a, b) = point
print("The point is at (\(a), \(b)).")

Я не могу найти упоминания о том, как сделать эквивалент для структур. Например:

struct S {
    let a, b: Int
}
let s = S(a: 1, b: 2)

// This doesn't work:
// let (sa, sb): s
// 
// Outputs: error: expression type 'S' is ambiguous without more context
// let (sa, sb) = s
//                ^

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Это не существует как таковое в языке.

Один параметр - это вычисляемое вспомогательное свойство:

struct S {
    let i: Int
    let b: Bool
}

extension S {
    var destructured: (Int, Bool) {
        return (self.i, self.b)
    }
}

let s = S(i: 10, b: false)
let (i, b) = s.destructured

Конечно, вы должны поддерживать синхронизацию вручную. Возможно, Sourcery мог бы помочь с этим.

0 голосов
/ 19 января 2019

Структуры не могут быть разрушены в Swift.

Ваш кортеж, point = (3, 2), относится к типу (Int, Int), что является частью того, почему вы можете его разрушить.

Тип вашей структуры, S, простоS.Его переменные, a и b, не включены в его тип так же буквально, как и для кортежа.Структура - это просто совершенно другой тип объекта, и такого поведения для него не существует.

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