我试图将我的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
}
}
我应该使用哪种类型而不是"字符串"?
答案 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
}