轉(zhuǎn)換流

作者:Erica Sadun,原文鏈接,原文日期:2016-08-29
譯者:Darren妈经;校對(duì):shanks;定稿:千葉知風(fēng)

我在很多地方都表達(dá)了我對(duì)流的喜愛(ài)捧书。我在 Swift Cookbook 中介紹了一些〈蹬荩現(xiàn)在,我將通過(guò) Pearson 的內(nèi)容更新計(jì)劃更新 Swift 3 的相關(guān)內(nèi)容经瓷,正好我有一些要說(shuō)的爆哑。我想在文章中添加一些有趣的新配方。

今天舆吮,讓我們談?wù)劇恨D(zhuǎn)換流』揭朝。你寫 print(..., to:) 時(shí)傳遞的傳統(tǒng)流,只是一個(gè)你傳遞給stdout色冀、stderr或文件的一個(gè)目標(biāo)而已潭袱。轉(zhuǎn)換流會(huì)從根本上改變流經(jīng)它的文本。你可以限制文本為全部小寫呐伞,或者做拼寫檢查敌卓,甚至打印到你的平臺(tái)的本地通知系統(tǒng)。

因此我決定創(chuàng)建一個(gè)翻譯流伶氢。如截圖所示趟径,當(dāng)你打印流的時(shí)候,會(huì)把英文文本轉(zhuǎn)換成其他語(yǔ)言癣防。

如圖所示蜗巧,我的解決方案充分利用了 Swift 標(biāo)準(zhǔn)庫(kù)內(nèi)置的 print 函數(shù)。Swift 允許打印到流蕾盯。當(dāng)使用我的 ItalianStream.shared 流時(shí)幕屹, 打印到控制臺(tái)的內(nèi)容被自動(dòng)翻譯成了我在流中提供的語(yǔ)言。

在我的實(shí)現(xiàn)中级遭,我希望能夠做到幾個(gè)關(guān)鍵點(diǎn):

  • 所有特定的翻譯功能都需要從打印流中分離望拖,這樣我可以在不打亂實(shí)現(xiàn)的情況下交換不同 API 提供的輸入和輸出。
  • 我希望能使用多種語(yǔ)言挫鸽。
  • 我需要提供一個(gè)可重用的 var 成員说敏,用于需要打印的流。
    為了實(shí)現(xiàn)這些目標(biāo)丢郊,我決定大量使用泛型和面向協(xié)議盔沫。我希望能夠用一個(gè)泛型化的流類型來(lái)跟蹤任意的語(yǔ)言医咨,這反過(guò)來(lái)將為打印提供一個(gè)共享的流實(shí)例。這可能聽起來(lái)有點(diǎn)繞架诞。

標(biāo)準(zhǔn)庫(kù)內(nèi)置的 TextOutputStream 協(xié)議剛好滿足了一個(gè)需求拟淮,一個(gè)接收一個(gè)字符串并做一些處理的方法。下面的代碼翻譯了字符串并打印了出來(lái)谴忧。

/// A text output stream that performs translation in
/// the process of printing
public struct TranslationStream<Language: EnglishTranslationProvider>: TextOutputStream {
    /// Writes the contents of the string to stdout after
    /// passing the string through an automatic translator
    public func write(_ string: String) {
        guard let translation = Language.translate(string) else { return }
        print(translation)
    }
}

比較 tricky 的是我的 TranslationStream 結(jié)構(gòu)是泛型很泊。它需要一個(gè)遵循 EnglishTraslationProvider 協(xié)議的類型,允許其從 provider 請(qǐng)求翻譯俏蛮。這是協(xié)議的內(nèi)容:

/// A provider of string translations from English
public protocol EnglishTranslationProvider {
    /// Returns a shared instance of the provider
    static var shared: TranslationStream<Self> { get }

    /// Returns a translated string
    static func translate(_ string: String) -> String?
}

每個(gè)語(yǔ)言翻譯的 provider 提供一個(gè) shared 翻譯流給 TranslationStream 類型供 打印時(shí)使用(就像在 ItalianStream.shared 的截圖中所看到的那樣 )撑蚌,以及一個(gè) translate 方法來(lái)返回字符串翻譯后的版本。例如搏屑,這是法語(yǔ) provider 類型的實(shí)現(xiàn):

/// A stream type that automatically translates from English to French
public struct FrenchStream: EnglishTranslationProvider {
    /// Returns a shared instance of the provider
    public static var shared = TranslationStream<FrenchStream>()
    
    /// Returns a translated string
    public static func translate(_ string: String) -> String? {
        return FrenchStream.translate(string, language: "fr")
    }
}

很簡(jiǎn)單吧争涌?這真的不難。它實(shí)現(xiàn)了兩個(gè)必要的成員辣恋,另一方面作為在協(xié)議擴(kuò)展中聲明的默認(rèn) translate 方法的代理亮垫。我的具體實(shí)現(xiàn)用了兩個(gè)字符的語(yǔ)言代碼,并通過(guò) Google 翻譯成英語(yǔ)伟骨。我在這里并沒(méi)有包含實(shí)際的translate(_ string:, language:) 方法饮潦,因?yàn)橛泻芏嘁资褂玫?API可供選擇,它們一般都需要 API key 和費(fèi)用携狭。

我試圖讓本文的重點(diǎn)是『哇继蜡,6666,你可以在打印流時(shí)轉(zhuǎn)換文本逛腿∠〔ⅲ』,而不是『哦单默,翻譯了碘举。』搁廓。我認(rèn)為翻譯流是展示這個(gè)特定的 Swift 特性的好方式引颈。

在下面的截圖中,我把(第20行)打印到了用戶的通知欄境蜕。

本文由 SwiftGG 翻譯組翻譯蝙场,已經(jīng)獲得作者翻譯授權(quán),最新文章請(qǐng)?jiān)L問(wèn) http://swift.gg粱年。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末售滤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逼泣,更是在濱河造成了極大的恐慌趴泌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拉庶,死亡現(xiàn)場(chǎng)離奇詭異嗜憔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)氏仗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門吉捶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人皆尔,你說(shuō)我怎么就攤上這事呐舔。” “怎么了慷蠕?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵珊拼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我流炕,道長(zhǎng)澎现,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任每辟,我火速辦了婚禮剑辫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘渠欺。我一直安慰自己妹蔽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布挠将。 她就那樣靜靜地躺著胳岂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捐名。 梳的紋絲不亂的頭發(fā)上旦万,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音镶蹋,去河邊找鬼成艘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贺归,可吹牛的內(nèi)容都是我干的淆两。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼拂酣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秋冰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起婶熬,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤剑勾,失蹤者是張志新(化名)和其女友劉穎埃撵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虽另,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡暂刘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捂刺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谣拣。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖族展,靈堂內(nèi)的尸體忽然破棺而出森缠,到底是詐尸還是另有隱情,我是刑警寧澤仪缸,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布贵涵,位于F島的核電站,受9級(jí)特大地震影響恰画,放射性物質(zhì)發(fā)生泄漏独悴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一锣尉、第九天 我趴在偏房一處隱蔽的房頂上張望刻炒。 院中可真熱鬧,春花似錦自沧、人聲如沸坟奥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爱谁。三九已至,卻和暖如春孝偎,著一層夾襖步出監(jiān)牢的瞬間访敌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工衣盾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寺旺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓势决,卻偏偏與公主長(zhǎng)得像阻塑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子果复,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容