"String"类型的表达式模式不能与"NSStoryboardSegue.Identifier"类型的值匹配

Gho*_*108 1 macos cocoa swift swift4

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

"String"类型的表达式模式不能与"NSStoryboardSegue.Identifier"类型的值匹配

这是我的代码:

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

        case "showVC1":
            // DO SOMETHING
            break

        default:
            break
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该使用哪种类型而不是"字符串"?

Mar*_*n R 8

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

extension NSStoryboardSegue {
    public struct Identifier : RawRepresentable, Equatable, Hashable {
        public init(_ rawValue: String)
        public init(rawValue: String)
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以打开它rawValue:

    switch segue.identifier?.rawValue {
    case "showVC1"?:
        // do something ...
    default:
        break
    }
Run Code Online (Sandbox Code Playgroud)

但是,建议的模式是为每个故事板标识符定义常量:

extension NSStoryboardSegue.Identifier {
    static let showVC1 = NSStoryboardSegue.Identifier("showVC1")
    // other storyboard identifiers ...
}
Run Code Online (Sandbox Code Playgroud)

然后可以匹配:

    switch segue.identifier {
    case .showVC1?:
        // do something ...
    default:
        break
    }
Run Code Online (Sandbox Code Playgroud)

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

为其他"标识符"引入了类似的类型,例如 NSImage.Name,它是NSImage(named:) Swift 4中的参数类型.

有关更多信息,请参阅swift-users邮件列表中的讨论,从以下位置开始

一般的想法(据我所知)是为每种标识符创建单独的类型.特别是(来自https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20170717/005940.html):

...我们故意劝阻名字的字符串文字.字符串文字应该只在一个地方:名称常量的定义.其他一切都应该使用常数.编译器可以提供常量的自动完成和拼写检测.字符串文字没有得到.