字符串插值的警告

时间:2018-05-13 20:07:20

标签: swift swift4 string-interpolation

我遇到了一个我无法解决的问题。我没有运气就试过互联网。

我对Swift和编码仍然很陌生,现在正按照指南帮助我创建应用程序。

不幸的是,据我所知,该应用程序是为Swift 3编写的,并且在我使用Swift 4后给了我一些问题。

我必须在线上给我这个警告:

  

字符串插值为可选值生成调试描述;你的意思是明确吗?

     

使用'字符串(描述:)来消除此警告修复

     

提供默认值以避免此警告修复

然而,当我点击Xcode的一个解决方案时,我遇到了另一个问题。

如果我使用第一个修复程序,应用程序崩溃,我收到以下消息:

  

线程1:致命错误:意外的Segue标识符;

如果我使用第二个修复,我必须指定一个默认值。我不知道应该是什么。

整个代码段如下。 这是以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 :(得分:1)

所以,第一个建议的修复程序适合你。它平息了编译时警告,尽管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标识符;”

这告诉您,您的switch与前两个案例不匹配,并且运行default案例。导致崩溃是因为您的代码明确调用了fatalError。你的segue.identifier显然是一个空字符串。

所以你的问题实际上在你的故事板中。您需要为segue分配标识符。单击视图控制器之间的segue箭头,并将标识符"AddItem""ShowDetail"分配给正确的segues。 segue标识符在Xcode右侧的属性检查器中分配。

答案 1 :(得分:0)

如果您准备为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-但尽管它起作用了,您仍然会收到烦人的编译器警告。