我一直在努力学习新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'只能用作通用约束 因为它有自我或相关的类型要求
是否有接受String
或Substring
的参数类型?
答案 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)
}
}
但是存在名称与其他框架冲突的危险。