swift x輸入流 Swift 文字輸出流

2021-10-12 13:16:31 字數 3027 閱讀 7592

print是swift標準庫中最常用的函式之一。實際上,這是程式設計師在編寫「hello,world!」時學習的第乙個函式。令人驚訝的是,我們很少有人熟悉其他形式。

令人震驚,我知道。

這就像了解你最好的朋友「chaz」 的中間名,並且他的完整法定名稱實際上是 「r」。巴克敏斯特小查爾斯拉格蘭德「 - 哦,而且,他們一直都有乙個完全相同的雙胞胎。

讓我們首先仔細看看之前的函式宣告:

func print(_ items: any...,

separator: string = default,

terminator: string = default,

to output: inout target)

where target : textoutputstream

這個過載print 採用可變長度的引數列表,後跟separator和terminator引數 - 兩者都有預設值。

separator是用於將每個元素的表示連線items 成單個字串的字串。預設情況下,這是乙個空格(" ")。

terminator是附加到列印表示的末尾的字串。預設情況下,這是換行符(\ n "\n")。

最後乙個引數output 採用target符合協議的泛型型別的可變例項。textoutputstream

符合的型別的例項 可以傳遞給函式以從標準輸出中捕獲和重定向字串。textoutputstream``print(_:to:)

實現自定義文字輸出流型別

由於unicode的多變性,您無法通過檢視字串來了解字串中潛伏的字元。在 組合標記, 格式字元, 不支援的字元, 變體序列, 連字,有向圖和其他表現形式之間,單個擴充套件字形集群可以包含遠遠超過眼睛的東西。

舉個例子,讓我們建立乙個符合的自定義型別。我們不會逐字地將字串寫入標準輸出,而是檢查每個組成**點。textoutputstream

符合協議只是滿足方法要求的問題。textoutputstream``write(_:)

protocol textoutputstream "

return escapedname

使用自定義文字輸出流的想法

現在我們知道swift標準庫的乙個不起眼的部分,我們可以用它做什麼?

事實證明,有很多潛在的用例。為了更好地了解它們是什麼,請考慮以下示例:textoutputstream

記錄到標準錯誤

預設情況下,swift print語句指向 標準輸出(stdout)。如果您希望改為指向 標準error(stderr),則可以建立新的文字輸出流型別並按以下方式使用它:

import func darwin.fputs

import var darwin.stderr

struct stderroutputstream: textoutputstream {

mutating func write(_ string: string) {

fputs(string, stderr)

var standarderror = stderroutputstream()

print("error!", to: &standarderror)

將輸出寫入檔案

前面的寫入示例stderr 可以概括為寫入任何流或檔案,而是通過建立輸出流 (可以通過型別屬性訪問標準錯誤)。filehandle

import foundation

struct filehandleroutputstream: textoutputstream {

private let filehandle: filehandle

let encoding: string.encoding

init(_ filehandle: filehandle, encoding: string.encoding = .utf8) {

self.filehandle = filehandle

self.encoding = encoding

mutating func write(_ string: string) {

if let data = string.data(using: encoding) {

filehandle.write(data)

按照這種方法,您可以自定義print寫入檔案而不是流。

let url = url(fileurlwithpath: "/path/to/file.txt")

let filehandle = try filehandle(forwritingto: url)

var output = filehandleroutputstream(filehandle)

print("\(date())", to: &output)

**流輸出

作為最後乙個例子,讓我們想象一下你會發現自己經常將控制台輸出複製貼上到某個**上的表單中的情況。不幸的是,該**有試**析無益的行為就好像它們是html。

每次發布到**時,您都可以建立乙個 自動處理該文字的內容,而不是採取額外的步驟來逃避文字(在這種情況下,我們使用我們發現深埋在core foundation中的xml轉義函式)。textoutputstream

import foundation

struct xmlescapinglogger: textoutputstream {

mutating func write(_ string: string) {

guard !string.isempty && string != "\n",

let xmlescaped = cfxmlcreatestringbyescapingentities(nil, string as nsstring, nil)

else {

return

print(xmlescaped)

var logger = xmlescapinglogger()

print("<3", to: &logger)

// prints "<3"

對於開發人員來說,列印是一種熟悉且便捷的方式,可以了解其**的行為。它補充了更全面的技術,如日誌框架和偵錯程式,並且 - 在swift的情況下 - 證明它本身就非常強大。

swift x輸入流 Swift 構造過程

swift 構造過程 構造過程是為了使用某個類 結構體或列舉型別的例項而進行的準備過程。這個過程包含了為例項中的每個屬性設定初始值和為其執行必要的準備和初始化任務。swift 建構函式使用 init 方法。與 objective c 中的構造器不同,swift 的構造器無需返回值,它們的主要任務是保...

標準輸入流

get 從流中提取字元,包括空格 read 無格式輸入指定位元組數 getline 從流中提取一行字元 ignore 提取並丟棄流中指定字元 peek 返回流中下乙個字元,但不從流中刪除 gcount 統計最後輸入的字元個數 seekg 移動輸入流指標 int get cin.get char rc...

緩衝輸入流

快取輸入流 bufferedinputstream繼承於filterinputstream,提供緩衝輸入流功能。緩衝輸入流相對於普通輸入流的優勢是,它提供了乙個緩衝陣列,每次呼叫read方法的時候,它首先嘗試從緩衝區裡讀取資料,若讀取失敗 緩衝區無可讀資料 則選擇從物理資料來源 譬如檔案 讀取新資料...