'String' 类型的表达式模式无法匹配 'NSStoryboardSegue.Identifier 类型的值

Expression pattern of type 'String' cannot match values of type 'NSStoryboardSegue.Identifier

我正在尝试将我的 Swift 3 代码转换为 Swift 4。我收到此错误消息:

Expression pattern of type 'String' cannot match values of type 'NSStoryboardSegue.Identifier

这是我的代码:

override func prepare(for segue: NSStoryboardSegue, sender: Any?) {
    switch segue.identifier {

        case "showVC1":
            // DO SOMETHING
            break

        default:
            break
    }
}

我应该使用哪种类型而不是 "String"?

Swift 4 将 identifier 属性 的类型从 String? 切换为 NSStoryboardSegue.Identifier?. The type is RawRepresentableRawTypeString。您可能需要将代码更改为 if 语句链,或显式使用 rawValue

switch segue.identifier {
    case let x where x.rawValue == "showVC1":
        // DO SOMETHING
    break
    default:
    break
}

从Swift 4开始,故事板标识符是可选的NSStoryboardSegue.Identifier,定义为

extension NSStoryboardSegue {
    public struct Identifier : RawRepresentable, Equatable, Hashable {
        public init(_ rawValue: String)
        public init(rawValue: String)
    }
}

您可以打开它 rawValue:

    switch segue.identifier?.rawValue {
    case "showVC1"?:
        // do something ...
    default:
        break
    }

推荐的模式不过是为每个定义常量 故事板标识符:

extension NSStoryboardSegue.Identifier {
    static let showVC1 = NSStoryboardSegue.Identifier("showVC1")
    // other storyboard identifiers ...
}

然后可以匹配:

    switch segue.identifier {
    case .showVC1?:
        // do something ...
    default:
        break
    }

在这两个示例中,"optional pattern" x?.some(x) 的快捷方式) 用于匹配可选值。

其他 "identifiers" 引入了类似的类型,例如 NSImage.Name,即NSImage(named:)的参数类型 在 Swift 4.

有关详细信息,请参阅关于 swift-用户邮件的讨论 列表,从

开始

总体思路(据我了解)是创建单独的类型 对于每种标识符。特别是(来自 https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20170717/005940.html):

... We are deliberately discouraging the string literal of the name. The string literal should be in only one place: the definition of the name constant. Everything else should use the constant. The compiler can provide autocompletion and typo detection of the constant. The string literal doesn't get that.