[解決済み] Xcode 8.3 betaの「String interpolation produces a debug description for an optional value; did you mean to make this explicit?
質問
ベータ 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
個人的には引数ラベルのままがいいんですけどね。
関連
-
Swiftがエラーを報告。アボートトラップ:6
-
[解決済み] クラス 'ViewController' は swift で初期化されません。
-
[解決済み] SwiftUI。TextFieldをファーストレスポンダーにするには?
-
[解決済み] タスクが終了するまで待機する
-
[解決済み] Swift 1.2では、宣言は「final」と「dynamic」の両方にはなり得ないというエラーがある
-
[解決済み] Swiftで警告を消すには?
-
[解決済み] Swift: PREPROCESSORフラグ(`#if DEBUG`など)を使ってAPIキーを実装する方法とは?
-
[解決済み] ビルド入力ファイルが見つかりません」Swift 4.2、Xcode 10.0
-
[解決済み] NSFetchRequestのインスタンスに型を適用する方法は?
-
[解決済み] Swift- Remove Push Notification Badge number?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Swift の Optional 値 && Optional のアンラップ時に予期せず nil が検出された場合の説明
-
[解決済み] Swift 3でカスタム通知を作成するには?
-
[解決済み] クラス 'ViewController' は swift で初期化されません。
-
[解決済み] UIViewの定高制約をプログラムで更新するには?
-
[解決済み] タスクが終了するまで待機する
-
[解決済み] 既存のUIKitアプリケーションにSwiftUIビューを含める
-
[解決済み] 非'@objc'メソッドは'@objc'プロトコルのオプション要件を満たしていない
-
[解決済み] Swiftで範囲を作成する方法は?
-
[解決済み] 固定サイズのオブジェクトの配列を作成する方法
-
[解決済み] ビルド入力ファイルが見つかりません」Swift 4.2、Xcode 10.0