将String或Substring作为参数的Swift方法

时间:2017-11-22 12:30:07

标签: swift string substring

我一直在努力学习新Swift 4字符串和子串的工作原理。

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

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'只能用作通用约束   因为它有自我或相关的类型要求

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

1 个答案:

答案 0 :(得分:3)

将其设为通用

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)
    }
}

但是存在名称与其他框架冲突的危险。