Подтвердить что ты не робот

Как решить "Интерполяция строк" ​​дает описание отладки для необязательного значения, вы хотели сделать это явным? " в Xcode 8.3 beta?

Начиная с бета-версии 8.3, предупреждения о циллионах "Интерполяция строк" ​​дает описание отладки для необязательного значения, вы хотели сделать это явным? " появился в моем коде.

Например, предупреждение появилось в следующей ситуации вверх, где параметры могут привести к нулю:

let msg = "*** Error \(options["taskDescription"]): cannot load \(sUrl) \(error)"

Как было ранее разработано, для меня (и для компилятора) было опционально, чтобы опции были интерполированы как "ноль". Но компилятор передумал.

Что предлагает компилятор, так это добавить конструктор String с описанием следующим образом:

let msg = "*** Error \(String(describing: options["taskDescription"])): cannot load \(sUrl) \(error)"

Очевидно, результаты явны, но, по моему мнению, очень громоздки. Есть ли лучший вариант? Должен ли я исправить все эти предупреждения или лучше подождать следующей беты?

Снимок экрана для описания

4b9b3361

Ответ 1

Это изменение, сделанное в this pull request из-за того, что интерполяция Optional(...) в результирующую строку часто нежелательна, и может быть особенно неожиданным в случаях с неявно развернутыми опциями. Вы можете увидеть полное обсуждение этого изменения в списке рассылки здесь.

Как упоминалось в обсуждении запроса на растяжение (хотя, к сожалению, не Xcode) - один более приятный способ заставить замолчать предупреждение, чем использование 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

Другим возможным способом отключения предупреждения является доступ к Optional debugDescription:

print("description of i: \(i.debugDescription)") // description of i: Optional(5)
print("description of d: \(d.debugDescription)") // description of d: nil

Хотя стоит отметить, что документация для CustomDebugStringConvertible препятствует прямому доступу debugDescription.

Ответ 2

кажется, что использование String (описание: необязательно) прост.

значение по умолчанию? не имеет смысла для non-Strings, например, Int. Если Int равен нулю, вы хотите, чтобы журнал показывал "nil" не по умолчанию другому Int, например. 0.

Некоторые коды площадки для тестирования:

var optionalString : String? = nil
var optionalInt : Int? = nil

var description_ = ""
description_ = description_ + "optionalString: \(String(describing: optionalString))\r"
description_ = description_ + "   optionalInt: \(String(describing: optionalInt))\r"

print(description_)

Выход

optionalString: nil
optionalInt: nil

Ответ 3

После обновления до Xcode 8.3 и получения большого количества предупреждающих сообщений я придумал следующее, что больше похоже на исходное поведение вывода, которое легко добавить, уменьшает многословность использования "String (описание:)" как в кода и вывода.

В принципе, добавьте необязательное расширение, которое дает строку, описывающую вещь в необязательном, или просто "ноль", если не задано. Кроме того, если вещь в необязательном является строкой, поместите ее в кавычки.

extension Optional {
    var orNil : String {
        if self == nil {
            return "nil"
        }
        if "\(Wrapped.self)" == "String" {
            return "\"\(self!)\""
        }
        return "\(self!)"
    }
}

И использование на игровой площадке:

var s : String?
var i : Int?
var d : Double?

var mixed = "s = \(s.orNil)    i = \(i.orNil)   d = \(d.orNil)" // "s = nil    i = nil   d = nil"

d = 3
i = 5
s = ""
mixed = "s = \(s.orNil)    i = \(i.orNil)   d = \(d.orNil)" // "s = ""    i = 5   d = 3.0"

s = "Test"
d = nil
mixed = "s = \(s.orNil)    i = \(i.orNil)   d = \(d.orNil)" // "s = "Test"    i = 5   d = nil"

Спасибо за помощь по следующей ссылке:

check-if-variable-is-an-optional-and-what-type-it-wraps

Ответ 4

Два простых способа решения этой проблемы.

Вариант 1:

Первым может быть "принудительное разворачивание" значения, которое вы хотели бы вернуть, используя bang (!)

var someValue: Int? = 5
print(someValue!)

Вывод:

5

Вариант 2:

Другим способом, который может быть лучшим способом, является "безопасно-развернуть" значение, которое вы хотите вернуть.

var someValue: Int? = 5

if let newValue = someValue {
    print(newValue)
}

Вывод:

5

Рекомендуем пойти с опцией 2.

Совет. Избегайте разворачивания силы (!), если это возможно, поскольку мы не уверены, что мы всегда будем иметь значение, которое будет развернуто.

Ответ 5

См. исправление Ole Begeman для этого. Я люблю это. Это создает??? который вы затем можете использовать следующим образом:

var someValue: Int? = 5
print("The value is \(someValue ??? "unknown")")
// → "The value is 5"
someValue = nil
print("The value is \(someValue ??? "unknown")")
// → "The value is unknown"

Ответ 6

Дважды щелкните по желтому треугольнику, отображаемому в строке, содержащей это предупреждение. Это будет показано FixIt с двумя решениями.

Добавлена ​​скриншот

  • Используйте String(describing:), чтобы отключить это предупреждение:

    Используя это, он станет String(describing:<Variable>)

    Eg.: String(describing: employeeName)

  • Предоставьте default value, чтобы избежать этого предупреждения:

    Используя это, он станет (<Variable> ?? default value)

    Например: employeeName ?? "Anonymous" as! String