【问题标题】:how to overload an assignment operator for Range<Unicode.Scalar> to String in swift如何快速将 Range<Unicode.Scalar> 的赋值运算符重载为 String
【发布时间】: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

但是,我不知道如何合并这些解决方案。

【问题讨论】:

标签: swift string range


【解决方案1】:

您可以声明自己的... 运算符,而不是使用ExpressibleByXXXLiteral,该运算符返回String

您的第二个链接中的这段代码使ClosedRange&lt;UnicodeScalar&gt; 符合Sequence,这允许我们从ClosedRange&lt;UnicodeScalar&gt; 初始化一个字符串:

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)

【讨论】:

    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 2013-02-14
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多