さて、Swiftでオプションを使用する通常の方法は、オプションのバインディングを介してそれらをアンラップすることです...
let stringA:String? = nil // (or "ABC")
if let unwrappedStringA = stringA
{
let x:String = unwrappedStringA
}
しかし、暗黙的にアンラップされたオプションを使用する次の方法も見ました。これは、追加の変数を必要としないだけでなく、「読み」やすく、英語に似ているため、個人的にはきれいに見えると思います (つまり、「これがnil ではありません...') そして可読性は Swift の核となる信条の 1 つです (特に今後の Swift 3.0 では)。
let stringA:String! = nil // (or "ABC")
if stringA != nil
{
let x:String = stringA
}
ただし、後者に関しては、Swift の「純粋主義者」はこれを「コードの匂い」と呼び、「悪い、悪い、悪い!!」と主張します...しかし、彼らは理由を説明しません! では、なぜそんなに悪いのですか?
注: はい、暗黙的にラップ解除されたオプションでは使用できない Optional チェーンやその他の機能については知っています。それらはすべて非常に優れた機能ですが、暗黙的にラップ解除されたオプションを nil に対してテストすることの技術的な欠点について具体的に尋ねています。対オプションのバインディング。
私が期待しているのは、一方が他方よりも優れている定量化可能な技術的な理由です (つまり、コンパイラの最適化、より優れた安全性チェック、パフォーマンスなど)。それをするために!' それが理にかなっていることを願っています。
アップデート
私は実際に、ラップされていない変数を保持するために新しい変数を作成する必要があるという私の懸念の 1 つ (少なくとも表面的な方法で) に対処する方法を見つけました。ここでの秘訣は、ラップされていない変数は実際にはオプション自体とは異なるスコープにあるため、まったく同じ名前を使用できることです。
さらに、大括弧自体の内側には、stringA という名前の変数を持つことができるさらに別のスコープがあります。これは、3 つの 'stringA' 変数を使用できるようになったことを意味します (しかし、そうすべきというわけではありません! )...
- オプションの
- アンラップされたオプション
- 括弧内の新しいローカル変数
これを示すこのクレイジーなコードは次のとおりです...
let stringA:String? = nil // (or "ABC") // First stringA variable
if let stringA = stringA
{
let x:String = stringA // <- This stringA is the unwrapped optional (the second stringA)
// Now we're just getting crazy (and smelly!)
let stringA = stringA + stringA // <- This is yet another stringA (third one!)
let y:String = stringA
}
繰り返しますが、私はこれを容認しません!! 他の人が有益な観点から興味深いと思うコードをいくつか示しているだけです。確かにやった!