我一直在努力学习新的 Swift 4 字符串和子字符串的工作原理。
由于您可以对 String 执行的大部分操作也可以对 Substring 执行,因此我试图找到一种方法将以下两种方法合二为一:
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' can only be used as a generic constraint because it has Self or associated type requirements
是否有接受String
或Substring
的参数类型?
最佳答案
让它通用
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)
}
}
但这会带来与其他框架名称冲突的危险。
关于以 String 或 Substring 作为参数的 Swift 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47434776/