Проблема в том, что если вы передаете необязательное, где ожидается необязательное, то необязательное не отклоняется; вместо этого он неявно заключен в Optional. Вот почему эта строка кода является допустимой:
let optionalValue: Bool? = true
И по той же причине эта строка кода допустима:
let nonOptionalValue: Bool = true
Foo(nonOptionalValue) // even though Foo's parameter is typed as Optional
Вы не можете отключить эту функцию. Это запечено в языке. И действительно, как показывает первый пример, вы сами стали на это полагаться! Таким образом, именно по этой причине вы никогда не сможете предотвратить передачу здесь не-Optional. Это цена, которую мы платим за удобство неявной опциональной упаковки.