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

时间:2017-08-05 09:47:41

标签: swift macos cocoa 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
    }
}

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

2 个答案:

答案 0 :(得分:8)

自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
    }

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

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

有关更多信息,请参阅有关swift-users邮件的讨论 列表,从

开始

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

  

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

答案 1 :(得分:0)

Swift 4将identifier属性的类型从String?切换为NSStoryboardSegue.Identifier?。类型为RawType的{​​{3}},String。您可能需要将代码更改为一系列if语句,或明确使用rawValue

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