@tera, you'll get the behavior you are after with this change in the definition of S:
struct S {
var a: Int
var b: Optional<Int> // Instead of Int?
var c: Int? = nil
}
let x = S(a: 0, b: nil, c: nil)
let z = S(a: 0, b: nil)
let y = S(a: 0, c: nil) // error: Missing argument for parameter 'b' in call
let w = S(a: 0) // error: Missing argument for parameter 'b' in call
Surprised? You're not alone. This topic is indeed currently discussed in Pre-pitch: remove the implicit initialization of Optional variables