【问题标题】:Swift method that takes either String or Substring as parameter将 String 或 Substring 作为参数的 Swift 方法
【发布时间】:2017-11-22 12:30:06
【问题描述】:

我一直在尝试了解新的 Swift 4 字符串和子字符串是如何工作的。

由于大多数可以对字符串执行的操作也可以对子字符串执行,因此我试图找到一种方法将以下两种方法合并为一个:

static func isConsonant(ipa: String) -> Bool {
    return "ptkʧfθsʃbdgʤvðzʒmnŋlwjhrʔɾ".contains(ipa)
}

static func isConsonant(ipa: Substring) -> Bool {
    return "ptkʧfθsʃbdgʤvðzʒmnŋlwjhrʔɾ".contains(ipa)
}

我想我记得读过一些关于 StringProtocol 的链接,但这不起作用:

static func isConsonant(ipa: StringProtocol) -> Bool {
    return "ptkʧfθsʃbdgʤvðzʒmnŋlwjhrʔɾ".contains(ipa)
}

错误是

Protocol 'StringProtocol' 只能用作通用约束 因为它有 Self 或关联的类型要求

是否有可以接受StringSubstring 的参数类型?

【问题讨论】:

    标签: swift string substring


    【解决方案1】:

    使其通用

    func isConsonant<T>(ipa: T) -> Bool where T: StringProtocol {
        return "ptkʧfθsʃbdgʤvðzʒmnŋlwjhrʔɾ".contains(ipa)
    }
    

    和其他StringProtocol一样 方法,例如

    func contains<T>(_ other: T) -> Bool where T : StringProtocol
    func appending<T>(_ aString: T) -> String where T : StringProtocol
    // ...
    

    也可以使它成为StringProtocol的扩展方法或属性

    extension StringProtocol {
        var isConsonant: Bool {
            return "ptkʧfθsʃbdgʤvðzʒmnŋlwjhrʔɾ".contains(self)
        }
    }
    

    但这有与其他框架发生名称冲突的危险。

    【讨论】:

    猜你喜欢
    • 2014-12-24
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    相关资源
    最近更新 更多