I have an enum declaring associated values in Swift, along with a method that is trying to get a value at a specific location in that entry:
enum myEnum {
case entry0(Float=0.0, Float=0.0)
...
}
var entry0XValue: Float {
switch self {
case .entry0(let x, let _):
return x
default:
return 0
}
}
The code works, but the problem I'm having here is when I compile this, the compiler is giving this warning:
'let' pattern has no effect; sub-pattern didn't bind any variables
This is referring to the underscore in the case switches. Is there any way to rewrite this to remove this warning?
CodePudding user response:
Spell it like
case .entry0(let x, _):
Or like
case let .entry0(x, _):
which works more generally like:
case let .entry0(x, y):
CodePudding user response:
The effect of a let <subpattern> pattern is that it binds values to identifier patterns that appear in <subpattern>, when the pattern is matched against. For example, the x in .entry0(let x, let _) is bound to 0.0, when you match it against MyEnum.entry0(0.0, 0.0) in a switch statement. Another example: when you do let (x, y) = (1, 2), the x and y are bound to 1 and 2 respectively. Note that in this case, <subpattern> is a tuple pattern, with identifier patterns inside it.
The let pattern let _ "has no effect" because there are no identifier patterns in <subpattern> (the wildcard pattern, _, in this case). As a result, the let pattern will match if and only if <subpattern> matches, which means that you don't need let at all. You can just write <subpattern> directly.
case .entry0(let x, _):
This removes the warning.
Since the .entry(...) part is also a pattern (an enumeration case pattern), you can write that part as the <subpattern>:
case let .entry0(x, _):
For more info on the syntax of patterns, see the Patterns section of the language reference.
