'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 RawRepresentable
、RawType
或 String
。您可能需要将代码更改为 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.
我正在尝试将我的 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 RawRepresentable
、RawType
或 String
。您可能需要将代码更改为 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.