Предупреждения от строковой интерполяции - PullRequest
0 голосов
/ 13 мая 2018

Я столкнулся с проблемой, которую не могу решить сам. Я попробовал Интернет без удачи.

Я все еще довольно новичок в Swift и кодировании, и сейчас следую руководству, помогающему мне создать приложение.

К сожалению, насколько я понимаю, приложение было написано для Swift 3 и вызывает у меня некоторые проблемы, так как я использую Swift 4.

У меня есть строки, которые дают мне это предупреждение:

Строковая интерполяция создает описание отладки для необязательного значения; Вы хотели сделать это явным?

Используйте 'String (description :)), чтобы отключить это предупреждение. Исправить

Укажите значение по умолчанию, чтобы избежать этого предупреждения. Fix

Однако, когда я нажимаю одно из решений Xcode, у меня возникает другая проблема.

Если я использую первое исправление, приложение вылетает, и я получаю следующее сообщение:

Поток 1: фатальная ошибка: неожиданный идентификатор перехода;

Если я использую второе исправление, мне нужно назначить значение по умолчанию. И я не знаю, что это должно быть.

Весь отрывок кода выглядит следующим образом. Это строка, начинающаяся с guard let selectedMealCell и последняя после default:, которая вызывает проблемы.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)

    switch(segue.identifier ?? "") {
    case "AddItem":
        os_log("Adding a new meal.", log: OSLog.default, type: .debug)

    case "ShowDetail":
        guard let mealDetailViewController = segue.destination as? MealViewController else {
            fatalError("Unexpected destination: \(segue.destination)")
        }

        guard let selectedMealCell = sender as? MealTableViewCell else {
            fatalError("Unexpected sender: \(sender)")
        }

        guard let indexPath = tableView.indexPath(for: selectedMealCell) else {
            fatalError("The selected cell is not being displayed by the table")
        }

        let selectedMeal = meals[indexPath.row]
        mealDetailViewController.meal = selectedMeal

    default:
        fatalError("Unexpected Segue Identifier; \(segue.identifier)")
    }
}

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Если вы готовы написать небольшое расширение для Optional, это может сделать задачу вставки значения необязательной переменной менее болезненной и избежать необходимости писать optionalVar ?? "" многократно:

Учитывая:

extension Optional: CustomStringConvertible {

    public var description: String {
        switch self {
        case .some(let wrappedValue):
            return "\(wrappedValue)"
        default:
            return "<nil>"
        }
    }
}

Затем вы можете написать:

var optionalWithValue: String? = "Maybe"
var optionalWithoutValue: String?

print("optionalWithValue is \(optionalWithValue.description)")
print("optionalWithoutValue is \(optionalWithoutValue.description)")

, что дает:

optionalWithValue is Maybe
optionalWithoutValue is <nil>

Вы также можете написать print("value is \(anOptionalVariable)") - .description является избыточным, посколькуВ любом случае print () использует CustomStringConvertible.description, но, хотя он работает, вы все равно получаете раздражающее предупреждение компилятора.

0 голосов
/ 14 мая 2018

Итак, первое предложенное исправление сработало для вас.Это успокоило предупреждение о времени компиляции, хотя по общему признанию String(describing:) является слабым решением.

В обоих случаях вам необходимо развернуть необязательное значение.Для первого случая вы должны использовать:

guard let selectedMealCell = sender as? MealTableViewCell else {
    if let sender = sender {
        fatalError("Unexpected sender: \(sender))")
    } else {
        fatalError("sender is nil")
    }
}

, а во втором случае:

fatalError("Unexpected Segue Identifier; \(segue.identifier ?? "")")

Тогда вы получили ошибку времени выполнения:

"НеожиданноSegue Identifier; "

Это говорит о том, что ваш switch не соответствует первым двум случаям, и он запускал дело default.Сбой вызван тем, что ваш код явно вызывает fatalError.Ваша segue.identifier, по-видимому, пустая строка.

Итак, ваша проблема на самом деле в раскадровке.Вы должны назначить идентификаторы вашим сегментам.Нажмите стрелки перехода между контроллерами представления и назначьте идентификаторы "AddItem" и "ShowDetail" для соответствующих сегментов. идентификатор segue назначается в Инспекторе атрибутов справа в Xcode.

...