【发布时间】:2021-08-03 06:26:37
【问题描述】:
我想覆盖字符串的“=”运算符,如下所示:
let a: String = "a"..."z"
print(a) // abcdefghijklmnopqrstuvwxyz
我找到了ExpressibleBy 协议和Initialize a String from a range of Characters in Swift
但是,我不知道如何合并这些解决方案。
【问题讨论】:
我想覆盖字符串的“=”运算符,如下所示:
let a: String = "a"..."z"
print(a) // abcdefghijklmnopqrstuvwxyz
我找到了ExpressibleBy 协议和Initialize a String from a range of Characters in Swift
但是,我不知道如何合并这些解决方案。
【问题讨论】:
您可以声明自己的... 运算符,而不是使用ExpressibleByXXXLiteral,该运算符返回String。
您的第二个链接中的这段代码使ClosedRange<UnicodeScalar> 符合Sequence,这允许我们从ClosedRange<UnicodeScalar> 初始化一个字符串:
extension Unicode.Scalar: Strideable {
public func advanced(by n: Int) -> Unicode.Scalar {
let value = self.value.advanced(by: n)
guard let scalar = Unicode.Scalar(value) else {
fatalError("Invalid Unicode.Scalar value:" + String(value, radix: 16))
}
return scalar
}
public func distance(to other: Unicode.Scalar) -> Int {
return Int(other.value - value)
}
}
extension String {
init<S: Sequence>(_ sequence: S) where S.Element == Unicode.Scalar {
self.init(UnicodeScalarView(sequence))
}
}
extension Sequence where Element == Unicode.Scalar {
var string: String { return String(self) }
}
使用它,我们的字符串生成 ... 操作符很容易定义:
func ...(lhs: UnicodeScalar, rhs: UnicodeScalar) -> String {
// note that this is not recursive
// this calls the "..." that produces a closed range
(lhs...rhs).string
}
用法:
let alphabet = "a"..."z"
print(alphabet)
【讨论】: