Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 来自字符串插值的警告_Swift_Swift4_String Interpolation - Fatal编程技术网

Swift 来自字符串插值的警告

Swift 来自字符串插值的警告,swift,swift4,string-interpolation,Swift,Swift4,String Interpolation,我遇到了一个我自己解决不了的问题。我试过上网,但运气不好 我对Swift和编码还是相当陌生的,现在我遵循一个帮助我创建应用程序的指南 不幸的是,正如我所理解的,该应用程序是为Swift 3编写的,由于我使用Swift 4,它给了我一些问题 我必须使用以下警告行: 字符串插值生成可选值的调试说明;你的意思是要说清楚吗 使用“字符串(描述:)”使此警告修复程序静音 提供默认值以避免此警告修复 然而,当我点击Xcode的一个解决方案时,我遇到了另一个问题 如果我使用第一个修复程序,应用程序会崩溃,我会

我遇到了一个我自己解决不了的问题。我试过上网,但运气不好

我对Swift和编码还是相当陌生的,现在我遵循一个帮助我创建应用程序的指南

不幸的是,正如我所理解的,该应用程序是为Swift 3编写的,由于我使用Swift 4,它给了我一些问题

我必须使用以下警告行:

字符串插值生成可选值的调试说明;你的意思是要说清楚吗

使用“字符串(描述:)”使此警告修复程序静音

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

然而,当我点击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)")
    }
}

因此,第一个建议的解决方案对您有效。它平息了编译时警告,尽管公认的
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(“意外发件人:\(发件人为任意)”