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

标签 swift string substring

我一直在努力学习新的 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

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

最佳答案

让它通用

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/

相关文章:

c++ - 在 C++ 中将字节字符串转换为普通字符串

c# - 一种简化提供的代码的优雅方式

SwiftUI:无法推断引用成员的上下文基础

ios - 如何以编程方式使用 SF Symbol?

ios - 应用程序关闭后不会重新打开

python - 如何检查字符串是否包含子字符串的所有字符?

使用子字符串检查字符串是否存在(使用链表)

ios - 添加和保存新联系人到地址簿

r - 从字符串数组生成累积的字符串数组

string - 如何在sql的where子句中使用like和substring