ベータ8.3以降、何十億という警告「文字列補間により、オプション値のデバッグ説明が生成されます。これを明示的にするつもりでしたか?」私のコードに登場しました。
たとえば、次の状況で警告が表示され、オプションがnilになる可能性があります。
let msg = "*** Error \(options["taskDescription"]): cannot load \(sUrl) \(error)"
以前に設計されたように、私(およびコンパイラー)がオプションを「nil」として補間することは問題ありませんでした。しかし、コンパイラは気を変えました。
コンパイラが提案するのは、次のように説明付きのStringコンストラクタを追加することです。
let msg = "*** Error \(String(describing: options["taskDescription"])): cannot load \(sUrl) \(error)"
明らかに、結果は明白ですが、私の意見では非常に非常に面倒です。より良いオプションはありますか?これらの警告をすべて修正する必要がありますか、それとも次のベータ版を待つ必要がありますか?
これは、結果の文字列への補間が望ましくない場合が多いために、このプルリクエストで行われた変更であり、暗黙的にラップされていないオプションがある場合はOptional(...)
特に驚くべきことです。この変更の詳細については、こちらのメーリングリストで確認できます。
プルリクエストの説明で述べたように(残念ながらXcodeによるものではありませんが)–を使用するよりも警告を止める方法の1つString(describing:)
は、補間するオプションの型にキャストを追加することです。たとえば、次のようにします。
var i: Int? = 5
var d: Double? = nil
print("description of i: \(i as Int?)") // description of i: Optional(5)
print("description of d: \(d as Double?)") // description of d: nil
これは次のようにも一般化できますas Optional
。
print("description of i: \(i as Optional)") // description of i: Optional(5)
print("description of d: \(d as Optional)") // description of d: nil
Swift 5では、SE-0228によって導入された新しい文字列補間システムで、別のオプションとして、次のカスタムappendInterpolation
オーバーロードを追加することができますDefaultStringInterpolation
。
extension DefaultStringInterpolation {
mutating func appendInterpolation<T>(optional: T?) {
appendInterpolation(String(describing: optional))
}
}
var i: Int? = 5
var d: Double? = nil
print("description of i: \(optional: i)") // description of i: Optional(5)
print("description of d: \(optional: d)") // description of d: nil
また、必要に応じて、引数ラベルを削除して、モジュール内(またはとマークした場合は特定のファイル内)で警告を完全に無効にすることもできますfileprivate
。
extension DefaultStringInterpolation {
mutating func appendInterpolation<T>(_ optional: T?) {
appendInterpolation(String(describing: optional))
}
}
var i: Int? = 5
var d: Double? = nil
print("description of i: \(i)") // description of i: Optional(5)
print("description of d: \(d)") // description of d: nil
個人的には、私は議論のラベルを保持したいと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加