Ini adalah perubahan yang dibuat dalam permintaan tarik ini karena fakta bahwa interpolasi Optional(...)ke string resultan sering kali tidak diinginkan, dan bisa sangat mengejutkan dalam kasus dengan opsional yang tidak terbungkus secara implisit . Anda dapat melihat diskusi lengkap tentang perubahan ini di milis di sini .
Seperti yang disebutkan dalam diskusi pull request (meskipun sayangnya bukan oleh Xcode) - satu cara yang sedikit lebih baik untuk membungkam peringatan daripada yang digunakan String(describing:)adalah dengan menambahkan cast ke tipe opsional dari apa pun yang Anda interpolasi, jadi misalnya:
var i: Int? = 5
var d: Double? = nil
print("description of i: \(i as Int?)")
print("description of d: \(d as Double?)")
Yang juga bisa digeneralisasikan untuk as Optional:
print("description of i: \(i as Optional)")
print("description of d: \(d as Optional)")
Di Swift 5, dengan sistem interpolasi string baru yang diperkenalkan oleh SE-0228 , opsi lainnya adalah menambahkan appendInterpolationkelebihan beban khusus untuk 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)")
print("description of d: \(optional: d)")
Dan, jika diinginkan, Anda bahkan dapat menghapus label argumen untuk menonaktifkan peringatan sepenuhnya di dalam modul (atau dalam file tertentu jika Anda menandainya sebagai 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)")
print("description of d: \(d)")
Meskipun secara pribadi saya lebih suka mempertahankan label argumen.