你如何编写一个扩展来同时支持 [String] 和 [Substring]?

How do you write an extension to support both [String] and [Substring]?

通常,要针对 [String] 编写扩展程序,您可以这样做...

extension Array where Element == String {
    ....
}

然而,有时我没有[String]而是[Substring]。您如何编写支持其中任何一种的扩展程序?

StringSubstring都符合StringProtocol协议, 所以你可以定义

extension Array where Element: StringProtocol {
    // ...
}

标准库中的许多函数已经被泛化 接受 StringProtocol 个参数,例如 Int 初始值设定项

convenience init?<S>(_ text: S, radix: Int = default) where S : StringProtocol

这样你就可以用 StringSubstring 来调用它:

let n = Int("1234")
let m = Int("1234".dropFirst())