Swift 来自字符串插值的警告
我遇到了一个我自己解决不了的问题。我试过上网,但运气不好 我对Swift和编码还是相当陌生的,现在我遵循一个帮助我创建应用程序的指南 不幸的是,正如我所理解的,该应用程序是为Swift 3编写的,由于我使用Swift 4,它给了我一些问题 我必须使用以下警告行: 字符串插值生成可选值的调试说明;你的意思是要说清楚吗 使用“字符串(描述:)”使此警告修复程序静音 提供默认值以避免此警告修复 然而,当我点击Xcode的一个解决方案时,我遇到了另一个问题 如果我使用第一个修复程序,应用程序会崩溃,我会收到以下消息: 线程1:致命错误:意外的序列标识符 如果我使用第二个修复,我必须指定一个默认值。我不知道这应该是什么 整段代码如下。 导致问题的是以Swift 来自字符串插值的警告,swift,swift4,string-interpolation,Swift,Swift4,String Interpolation,我遇到了一个我自己解决不了的问题。我试过上网,但运气不好 我对Swift和编码还是相当陌生的,现在我遵循一个帮助我创建应用程序的指南 不幸的是,正如我所理解的,该应用程序是为Swift 3编写的,由于我使用Swift 4,它给了我一些问题 我必须使用以下警告行: 字符串插值生成可选值的调试说明;你的意思是要说清楚吗 使用“字符串(描述:)”使此警告修复程序静音 提供默认值以避免此警告修复 然而,当我点击Xcode的一个解决方案时,我遇到了另一个问题 如果我使用第一个修复程序,应用程序会崩溃,我会
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)")
}
}
因此,第一个建议的解决方案对您有效。它平息了编译时警告,尽管公认的
String(description:)
是一个弱解决方案
在这两种情况下,都需要展开可选值。对于第一种情况,您应使用:
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 ?? "")")
然后出现运行时错误:
“意外的序列标识符;”
这意味着您的开关
与前两种情况不匹配,它运行的是默认情况
情况。导致崩溃的原因是代码显式调用了fatalError
。您的segue.identifier
显然是一个空字符串
所以你的问题其实在你的故事板上。您需要为您的序列分配标识符。单击视图控制器之间的分段箭头,将标识符
“AddItem”
和“ShowDetail”
分配给适当的分段。序列标识符在Xcode右侧的属性检查器中分配。因此,第一个建议的修复方法对您有效。它平息了编译时警告,尽管公认的String(description:)
是一个弱解决方案
在这两种情况下,都需要展开可选值。对于第一种情况,您应使用:
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 ?? "")")
然后出现运行时错误:
“意外的序列标识符;”
这意味着您的开关
与前两种情况不匹配,它运行的是默认情况
情况。导致崩溃的原因是代码显式调用了fatalError
。您的segue.identifier
显然是一个空字符串
所以你的问题其实在你的故事板上。您需要为您的序列分配标识符。单击视图控制器之间的分段箭头,将标识符
“AddItem”
和“ShowDetail”
分配给适当的分段。序列标识符是在Xcode右侧的属性检查器中分配的。如果您准备为可选变量编写一个小的扩展名,那么插入可选变量值的过程就不会那么痛苦,并且避免了编写optionalVar??“”
重复:
鉴于:
extension Optional: CustomStringConvertible {
public var description: String {
switch self {
case .some(let wrappedValue):
return "\(wrappedValue)"
default:
return "<nil>"
}
}
}
其中:
optionalWithValue is Maybe
optionalWithoutValue is <nil>
optionalWithValue可能是
OptionalWithout值为
您也可以编写
print(“value is\(anOptionalVariable)”)
--由于print()使用CustomStringConvertible.description,因此.description
是多余的,但尽管它可以工作,您仍然会收到恼人的编译器警告。如果您准备为Optional编写一个小的扩展,它可以减少插入可选变量值的痛苦,并避免编写optionalVar??“”
重复:
鉴于:
extension Optional: CustomStringConvertible {
public var description: String {
switch self {
case .some(let wrappedValue):
return "\(wrappedValue)"
default:
return "<nil>"
}
}
}
其中:
optionalWithValue is Maybe
optionalWithoutValue is <nil>
optionalWithValue可能是
OptionalWithout值为
您也可以编写
print(“value is\(anOptionalVariable)”)
--由于print()使用CustomStringConvertible.description,因此.description
是多余的,但尽管它可以工作,您仍然会收到恼人的编译器警告。请永远不要使用字符串(description:)
,Xcode发出的消息具有误导性。相反,您应该首先打开可选的,然后使用插值或其他方法。我认为您可以编写fatalError(“意外发件人:\(发件人为任意)”)
。请不要使用String(description:)
,Xcode发送的消息具有误导性。相反,您应该首先打开可选的,然后使用插值或其他方法。我认为您可以编写fatalError(“意外发件人:\(发件人为任意)”
。