gpt4 book ai didi

swift - 类型为 'String' 的表达式模式无法匹配类型为“NSStoryboardSegue.Identifier”的值

转载 作者:搜寻专家 更新时间:2023-11-01 05:49:47 24 4
gpt4 key购买 nike

我正在尝试将我的 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 开始, Storyboard标识符是一个可选的 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
}

然而,推荐的模式是为每个定义常量 Storyboard标识符:

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 ):

... 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.

关于swift - 类型为 'String' 的表达式模式无法匹配类型为“NSStoryboardSegue.Identifier”的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45520502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com