2017-08-05 43 views
1

我想我的斯威夫特3代码转换为斯威夫特4.我收到此错误信息:类型的表达模式“字符串”不能匹配类型的值“NSStoryboardSegue.Identifier

表达模式”字符串“不能匹配类型的值” NSStoryboardSegue.Identifier

这是我的代码:

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

     case "showVC1": 
      // DO SOMETHING 
      break 

     default: 
      break 
    } 
} 

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

回答

0

斯威夫特4 *identifier财产的类型从String?转换为NSStoryboardSegue.Identifier?。这种类型是RawRepresentableRawTypeString。您可能需要更改您的代码的if陈述链,或使用rawValue明确:在测试

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

*目前。

+0

@MartinR我还没有访问Swift 4,从规范回答。我删除了提示'=='可能的部分答案。在一个不相干的笔记中,我真的很惊讶苹果公司在这方面做了一个突破性的改变:我想不出将'标识符'从'String'改为它自己的类型所带来的好处。感谢您的评论! – dasblinkenlight

+1

对其他“标识符字符串”做了类似的修改,例如'NSImage(named:NSImage.Name)'。如果我没有记错的话,那是在Swift邮件列表中讨论的(有争议的)。我会尽量在稍后找到一些参考资料,列表档案目前处于离线状态。我感到奇怪的是,这种改变并没有通过提案流程,至少我不记得这一点。 –

+0

我找到了参考资料,请参阅下面的更新答案。 –

6

作为夫特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:) 斯威夫特4

参数的类型有关更多信息,请参阅讨论迅速用户邮件 表,从

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

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