Swift 3,switch语句,case hasPrefix

8
在Swift2中,您可以编写类似以下代码的内容:
    switch productIdentifier {
    case hasSuffix("q"):
        return "Quarterly".localized
    case hasSuffix("m"):
        return "Monthly".localized
    default:
        return "Yearly".localized
    }

并且它可以工作。在 Swift 3 中,我唯一能使上述代码工作的方法是:

    switch productIdentifier {
    case let x where x.hasSuffix("q"):
        return "Quarterly".localized
    case let x where x.hasSuffix("m"):
        return "Monthly".localized
    default:
        return "Yearly".localized
    }

这似乎失去了Swift2版本的清晰度,让我觉得自己错过了什么。当然,以上只是一个简单的版本。我很好奇是否有更好的处理方法?


1
我无法让你的Swift 2代码在Swift 2.2.1 / Xcode 7.3.1上运行。你能否展示一个实际可工作的代码? - OOPer
那是可行的代码 - 我直接从我的代码库中取出。然而,像字符串本地化的扩展之类的东西对你来说可能不起作用,因为你没有那个扩展。 - AlexK
这与问题无关,所以不是。唯一相关的部分是switch和case语句。返回值不是关键。问题明确地针对case语句,这是显而易见的。 - AlexK
如果这很明显,我就不会写这样的评论了。你脑海中的显而易见可能对读者来说并不明显。在发布问题时始终要以这种方式思考,这样您可以改进问题,并且您可能更快地得到正确的答案。回答者已经忽略了您的Swift 2代码,因为它没有任何意义。 - OOPer
但是,我在我的评论中发现了一个错误。我应该说即使我有扩展名,你的 Swift 2 代码也永远不会起作用 - OOPer
显示剩余2条评论
2个回答

23

我不知道这是否比你的示例中使用值绑定更好,但你可以直接使用下划线代替。

switch productIdentifier {
case _ where productIdentifier.hasSuffix("q"):
    return "Quarterly".localized
case _ where productIdentifier.hasSuffix("m"):
    return "Monthly".localized
default:
    return "Yearly".localized

感谢您的理解。我只是觉得在每个 case 中重复变量名称有些不对劲。 - AlexK

3

你只检查了productIdentifier的最后一个字符。你可以这样做:

switch productIdentifier.last {
case "q"?:
    return "Quarterly".localized
case "m"?:
    return "Monthly".localized
default:
    return "Yearly".localized
}

1
这是针对这个特定问题的更好解决方案,加一。 - Alexander
@AlexanderMomchliov,同意。我个人认为Swift 3的语法并不那么不清晰,但如果我只想检查最后一个字符,我会使用这个解决方案。 - vacawama
这会起作用。通常为了性能原因,我会避免使用字符集合。这还会移除标准库的任何优化。因此,实际上原始代码更好,尽管看起来不太干净。 - AlexK
我认为一次获取字符串的最后一个字符比重复应用 hasSuffix 更有效率。无论哪种情况,读者的清晰度可能是更大的关注点。在 Swift4 中,语法变成了 productIdentifier.last - vacawama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接