I have come across a need in pattern matching an InlineArray and was very surprised to find out that while I can do this:
@available(macOS 26, *)
mutating func names<let count: Int>() -> [count of Name] {
InlineArray { _ in _names.next() }
}
I can't actually use this the way I wanted:
// doesn't work :(
let [x, y, z] = names()
forcing me to instead do either of these, which are suboptimal because I'm going to be writing hundreds of tests with that pattern:
// locals[0], locals[1], etc. I've lost the name :(
let locals = names()
// got the name back but "lost" my short-hand :(
let (x, y, z) = (locals[0], locals[1], locals[2])
// wonderful! except...
let (x, y, z) = names()
// ...now I've got this in my code and it keeps growing to like 30
mutating func vars() -> (Var) {
(_vars.next())
}
mutating func vars() -> (Var, Var) {
(_vars.next(), _vars.next())
}
mutating func vars() -> (Var, Var, Var) {
(_vars.next(), _vars.next(), _vars.next())
}
mutating func vars() -> (Var, Var, Var, Var) {
(_vars.next(), _vars.next(), _vars.next(), _vars.next())
}
mutating func vars() -> (Var, Var, Var, Var, Var) {
(_vars.next(), _vars.next(), _vars.next(), _vars.next(), _vars.next())
}
mutating func vars() -> (Var, Var, Var, Var, Var, Var) {
(_vars.next(), _vars.next(), _vars.next(), _vars.next(), _vars.next(), _vars.next())
}
mutating func vars() -> (Var, Var, Var, Var, Var, Var, Var) {
(_vars.next(), _vars.next(), _vars.next(), _vars.next(), _vars.next(), _vars.next(), _vars.next())
}
mutating func vars() -> (Var, Var, Var, Var, Var, Var, Var, Var) {
(_vars.next(), _vars.next(), _vars.next(), _vars.next(), _vars.next(), _vars.next(), _vars.next(), _vars.next())
}
I'd therefore like to suggest an InlineArray pattern matching.
let [x, y, z] = names()
switch names {
case let [x]: // ...
case let [x, y]: // ...
case let [x, y, z]: // ...
case let [_, y, z, w] where y * z == w: // ...
default: // ...
}
if case let [x] = names { /* ... */ }
and so forth.
Thoughts?