Skip to content

Latest commit

 

History

History
52 lines (37 loc) · 2.05 KB

7.8 文本输出流.md

File metadata and controls

52 lines (37 loc) · 2.05 KB

第七章 字符串

C7P8 文本输出流

这一节主要讲了关于自定义一些print打印输出的两个重要协议

TextOutputStreamTextOutputStreamable 就是标准库内置的一个标准输出流协议

大概意思就是对你的print方法做一些加工

首先我们先看TextOutputStream 协议。

下面是标准库中对 TextOutputStream 协议的解释和说明,使用场景就是对我们打印的内容做一些转化 举例中的ASCIILogger() 系统库中并不存在,只是做说明写的一个。

/// The `ASCIILogger` type's `write(_:)` method processes its string input by
/// escaping each Unicode scalar, with the exception of `"\n"` line returns.
/// By sending the output of the `print(_:to:)` function to an instance of
/// `ASCIILogger`, you invoke its `write(_:)` method.
///
///     let s = "Hearts ♡ and Diamonds ♢"
///     print(s)
///     // Prints "Hearts ♡ and Diamonds ♢"
///
///     var asciiLogger = ASCIILogger()
///     print(s, to: &asciiLogger)
///     // Prints "Hearts \u{2661} and Diamonds \u{2662}"
public protocol TextOutputStream {

    /// Appends the given string to the stream.
    mutating func write(_ string: String)
}

实现TextOutputStream协议只需要实现其write方法。 调用print(“”, to: &打印转换的实例对象)这个方法即可。

ASCIILogger结构体的具体实现

struct ASCIILogger: TextOutputStream {
    mutating func write(_ string: String) {
        let ascii = string.unicodeScalars.lazy.map { scalar in
            scalar == "\n"
              ? "\n"
              : scalar.escaped(asASCII: true)
        }
        print(ascii.joined(separator: ""), terminator: "")
    }
}

知识点: String 默认实现了TextOutputStream协议

swift官方文档对TextOutputStream有很详细的说明,感兴趣的同学可以看看😄