1. ホーム
  2. swift

[解決済み] Xcode 8.3 betaの「String interpolation produces a debug description for an optional value; did you mean to make this explicit?

2022-11-28 18:55:13

質問

ベータ 8.3 以降、私のコードに Zillions warnings "String interpolation produces a debug description for an optional value; did you mean to make this explicit?" が表示されるようになりました。

例えば、以下のような↑のような状況で、オプションが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

個人的には引数ラベルのままがいいんですけどね。