我遇到了一个我无法解决的问题。我没有运气就试过互联网。
我对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)")
}
}
答案 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-但尽管它起作用了,您仍然会收到烦人的编译器警告。