Swift 中 Literal 可以這么用,你造嗎通熄?

簡(jiǎn)評(píng):看看這段 Swift 代碼:
let link:LinkedList = [1,2,3,4,5,6,7,8]
link 并不是一個(gè)數(shù)組哦唆涝,看完這篇文章你就懂了。

自2012年以來(lái)唇辨,可以使用 “l(fā)iteral” 表達(dá)式初始化NSDictionary廊酣,NSArray,NSNumber或NSString赏枚。

NSNumber *numb = @1;
NSArray *things = @[@3,@45,@65];
NSDictionary *map = @{@"Florida" : @1 , @"Nevada" : @6 };
NSString *greet = @"Hello there!";

這種 “l(fā)iteral” 表達(dá)式讓代碼變得更加簡(jiǎn)潔亡驰。

你有沒(méi)有想過(guò)使用 “l(fā)iteral” 表達(dá)式來(lái)初始化自己的數(shù)據(jù)結(jié)構(gòu)。

Swift 中提供了 “ExpressibleBy _____” 這類(lèi)協(xié)議:

  • Expressible By Array Literal
  • Expressible By Boolean Literal
  • Expressible By Dictionary Literal
  • Expressible By Float Literal
  • Expressible By Integer Literal
  • Expressible By String Literal
  • Expressible By Unicode Scalar Literal
  • Expressible By Extended Grapheme Cluster Literal

可以使用 “l(fā)iteral” 表達(dá)式來(lái)初始化自己的數(shù)據(jù)結(jié)構(gòu)嗡贺,可以看看下面的例子隐解,如何使用 “l(fā)iteral” 表達(dá)式來(lái)構(gòu)建自己的數(shù)據(jù)結(jié)構(gòu)。

Array-ish 數(shù)據(jù)結(jié)構(gòu)

來(lái)看看 Swift 中的例子诫睬, [1,2,3,4,5,6,7,8] 這很可能用于初始化一個(gè) Array。但是帕涌!他也可以用于初始化成其他的數(shù)據(jù)結(jié)構(gòu)摄凡。

鏈表

下面這段代碼就是介紹如何使用 Array literal 來(lái)初始化一個(gè)鏈表:

class LinkedList<T> : ExpressibleByArrayLiteral, CustomDebugStringConvertible {
    var debugDescription: String {
        get {
            var accum = ""
            guard let startNode = self.head else { return "(empty list)" }
            accum += startNode.debugDescription
            var currentNode:Node = startNode
            while(true) {
                guard let node = currentNode.next else { break }
                accum += node.debugDescription
                currentNode = node
            }
            return accum
        }
    }
    var head:Node?
    var tail:Node?
    typealias Element = T
    required public init(arrayLiteral elements:Element...) {
        for i in elements {
            if self.head == nil {
                self.head = Node(data:i)
                self.tail = self.head
                continue
            }
            let newNode = Node(data:i)
            self.tail?.next = newNode
            self.tail = newNode
        }
    }
    class Node : CustomDebugStringConvertible {
        var debugDescription: String {
            get {
                var accum = "(\(data))->"
                if next == nil {
                    accum += "*"
                }
                return accum
            }
        }
        var next:Node?
        var data:T
        init(data:T) {
            self.data = data
        }
    }
}
let link:LinkedList<Int> = [1,2,3,4,5,6,7,8]
print(link)   // Prints (1)->(2)->(3)->(4)->(5)->(6)->(7)->(8)->*

LinkedList 類(lèi)遵從 ExpressibleByArrayLiteral 協(xié)議续徽,實(shí)現(xiàn) init(arrayLiteral: Self.Element...) 這個(gè)初始化方法, 那么我們就可以直接使用 Array literal 賦值進(jìn)行初始化亲澡。

let link:LinkedList<Int> = [1,2,3,4,5,6,7,8] 

注意:必須使用 Array literal 來(lái)賦值钦扭,而不能用一個(gè)數(shù)組賦值,因?yàn)檫@是兩個(gè)不同的東西床绪,例如:

let someArray = [1,2,3,4]
let list:LinkedList<Int> = someArray  // 這段代碼會(huì)報(bào)錯(cuò)客情。

堆棧

struct ConvertibleStack<T> : ExpressibleByArrayLiteral, CustomDebugStringConvertible {

    var debugDescription: String {
        get {
            return "Stack: \(storage)"
        }
    }
    typealias Element = T
    private var storage: [T] = []

    public init(arrayLiteral elements:Element...) {
        self.storage = elements
    }

    mutating func push(item:T) {
        storage.insert(item, at: 0)
    }

    mutating func pop() -> T? {
        guard storage.count > 0 else { return nil }
        return storage.remove(at: 0)
    }
}

隊(duì)列

struct ConvertibleStack<T> : ExpressibleByArrayLiteral, CustomDebugStringConvertible {

    var debugDescription: String {
        get {
            return "Stack: \(storage)"
        }
    }
    typealias Element = T
    private var storage: [T] = []

    public init(arrayLiteral elements:Element...) {
        self.storage = elements
    }

    mutating func push(item:T) {
        storage.insert(item, at: 0)
    }

    mutating func pop() -> T? {
        guard storage.count > 0 else { return nil }
        return storage.remove(at: 0)
    }
}

最后,如果正確的使用 litera 初始化可以提高可讀性癞己。這種方法適用于樹(shù)或有向圖嗎膀斋?我把這個(gè)探索留給了讀者 : ) Happy Hacking!

原文:Express Yourself Swift Style

推薦閱讀:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绩社,一起剝皮案震驚了整個(gè)濱河市摔蓝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愉耙,老刑警劉巖贮尉,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異朴沿,居然都是意外死亡猜谚,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)悯仙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)龄毡,“玉大人,你說(shuō)我怎么就攤上這事锡垄÷倭悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵货岭,是天一觀的道長(zhǎng)路操。 經(jīng)常有香客問(wèn)我,道長(zhǎng)千贯,這世上最難降的妖魔是什么屯仗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮搔谴,結(jié)果婚禮上魁袜,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好峰弹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布店量。 她就那樣靜靜地躺著,像睡著了一般鞠呈。 火紅的嫁衣襯著肌膚如雪融师。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天蚁吝,我揣著相機(jī)與錄音旱爆,去河邊找鬼。 笑死窘茁,一個(gè)胖子當(dāng)著我的面吹牛怀伦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庙曙,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼空镜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了捌朴?” 一聲冷哼從身側(cè)響起吴攒,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砂蔽,沒(méi)想到半個(gè)月后洼怔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡左驾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年倡鲸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了占遥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖着帽,靈堂內(nèi)的尸體忽然破棺而出诸典,到底是詐尸還是另有隱情展运,我是刑警寧澤播掷,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站猜煮,受9級(jí)特大地震影響次员,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜王带,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一淑蔚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愕撰,春花似錦刹衫、人聲如沸醋寝。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)甥桂。三九已至柿究,卻和暖如春邮旷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝇摸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工婶肩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人貌夕。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓律歼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親啡专。 傳聞我的和親對(duì)象是個(gè)殘疾皇子险毁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件们童、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評(píng)論 4 62
  • 關(guān)于 Swift 重要這個(gè)文檔所包含的準(zhǔn)備信息, 是關(guān)于開(kāi)發(fā)的 API 和技術(shù)的畔况。這個(gè)信息可能會(huì)改變, 根據(jù)這個(gè)文...
    無(wú)灃閱讀 4,275評(píng)論 1 27
  • 首先安裝Firebird,官網(wǎng)下個(gè)pkg裝一下就好了慧库。 然后創(chuàng)建Firebird鏈接跷跪,為后面編譯interbase...
    zidaneno5閱讀 956評(píng)論 0 1
  • 快速提升 前面提到有關(guān)于學(xué)習(xí)能力的話題,既然你選擇了程序員這個(gè)行業(yè)齐板,就得接受在將來(lái)的日子里保持持續(xù)學(xué)習(xí)的狀態(tài)吵瞻,軟件...
    楚秀才閱讀 282評(píng)論 0 1