使用Swift结构的值绑定模式

时间:2019-01-19 00:18:47

标签: swift struct destructuring

作为Swift编程书籍describes,元组可以在赋值中或在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 :(得分:2)

这在语言中并不存在。

一个选项是助手计算属性:

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可以帮助实现这一点。

答案 1 :(得分:1)

结构无法在Swift中进行分解。

您的元组point = (3, 2)的类型为(Int, Int),这是您能够对其进行结构分解的部分原因。

您的结构类型SS。其变量ab并未以与元组相同的文字方式包含在其类型中。结构只是一种完全不同的对象,因此不存在这种行为。