用枚舉簡(jiǎn)化登錄操作

今天的內(nèi)容翻譯自Simplifying Login with Swift Enums,隱隱約約的記得好像有人翻譯過這篇內(nèi)容识虚,我本來對(duì)這篇內(nèi)容不是很感興趣,但無意中發(fā)現(xiàn)了另外一篇博文指出:《Simplifying Login with Swift Enums》這么做并不好妒茬,所以我的興趣就來了担锤,我準(zhǔn)備把兩篇內(nèi)容都整理一下,今天先發(fā)這一篇乍钻。首先要推薦大家看原文肛循,我這里并沒有逐句的對(duì)照翻譯,我是按照自己的理解重新把內(nèi)容整理了一遍银择。如果有出現(xiàn)不正確的地方歡迎大家留言給我多糠。

原作者David East根據(jù)自己的經(jīng)驗(yàn)得出一個(gè)結(jié)論:一款app在登錄操作上夹孔,如果想獲得用戶的信任和好評(píng)害捕,那么需要為用戶提供選擇尝盼,提供多種登陸方式裁赠。David East認(rèn)為swift的枚舉可以有效的對(duì)登錄邏輯進(jìn)行抽象佩捞,從而令我們能夠保持view controllers的干凈簡(jiǎn)潔莲蜘。我自己確認(rèn)為這篇內(nèi)容做為enum的基本介紹是比較合適的票渠。

使用枚舉定義社交賬號(hào)登錄

enum LoginProvider {
  case Facebook
  case Email
  case Google
  case Twitter
}

很多語言的枚舉只是出于類型安全的考慮而把普通類型打個(gè)包而已,而swift中的枚舉則是一個(gè)實(shí)實(shí)在在的 first-class杜窄,枚舉中每一個(gè)case都是一個(gè)fully-fledged value羞芍,例如:Facebook 的類型就是LoginProvider。

枚舉的Raw Values

我們可以給枚舉的每一個(gè)case存儲(chǔ)一個(gè)值畏浆,我們把這種值稱作枚舉的Raw Values刻获。

enum LoginProvider: String {
  case Facebook = "facebook"
  case Email = "email"
  case Google = "google"
  case Twitter = "twitter"
}

對(duì)于Raw Values我們應(yīng)該關(guān)注幾件事情:

  • Raw Values要求枚舉的定義是有明確的返回類型,我們這里是 String
  • 枚舉的每個(gè)case的類型必須是一致的
  • 我們可以通過rawValue來初始化一個(gè)枚舉沐兵,參數(shù)名稱就是rawValue
let provider = LoginProvider.init(rawValue: "email")

通過定義的rawValue “email”,我們可以獲得一個(gè) Email毁靶,這個(gè)確實(shí)很方便预吆。

Associated Values

rawValue實(shí)際上是給枚舉的每個(gè)case做了一個(gè)常量的預(yù)設(shè)值觅够,那我們可不可以給每個(gè)case綁定一個(gè)變量值呢喘先?這樣的話我們就可以非常方便的給以枚舉根據(jù)特定情況綁定不同的值了。幸運(yùn)的是涤姊,swift確實(shí)提供這個(gè)能力:Associated Values

enum LoginProvider {
  case Facebook
  case Email(String, String)
  case Google
  case Twitter
}

let provider = LoginProvider.Email("bob@bob.com", "pass")

關(guān)于Associated Values我們可以關(guān)注幾件事情:

  • 每個(gè)case的類型可以不同思喊,各自根據(jù)各自的需要使用類型
  • 枚舉的定義上面沒有返回值了
  • Associated Values可以是任意類型

我們可以定義一個(gè)user類型,然后作為枚舉的Associated Values。

struct LoginUser {
  let email: String
  let password: String
  func isValid() -> Bool {
    return email != "" && password != ""
  }
}


enum LoginProvider {
  case Facebook
  case Email(LoginUser)
  case Google
  case Twitter
}

有了這樣的定義之后剂公,我們就可以創(chuàng)建一個(gè)Email枚舉了.

let provider = LoginProvider.Email(user)

在Associated Values特性的幫助下,枚舉可以“滲透到”各種問題的解決方案中去拖吼,而不會(huì)因?yàn)殛P(guān)聯(lián)類型問題而被拒之門外吊档。

case where

原作者說:正是因?yàn)橛蠥ssociated Values特性的存在涡上,才顯得case where特別的甜吩愧。

let provider = LoginProvider.Email(user)

switch provider {
  case let .Email(user) where user.isValid():
    // login!
    break
  case let .Email(user) where !user.isValid():
    // don’t login!
    break
}

case let 首先對(duì)Email進(jìn)行了值綁定(把user對(duì)象抽出來)脐帝,然后使用使用where關(guān)鍵字引入的條件表達(dá)式堵腹,對(duì)邏輯進(jìn)行了一步處理疚顷。switch與枚舉的配合確實(shí)相當(dāng)完美(和Tuples也類似)阀坏。

Functions

說case where還只是一個(gè)鋪墊忌堂,畢竟我們是在這里贊美枚舉嗎,switch再好也不是枚舉的內(nèi)容啊李命。無需感到遺憾封字,枚舉內(nèi)可以定義function,可以整合所有你需要的內(nèi)容笆制。

enum LoginProvider {
    case Facebook
    case Email(LoginUser)
    case Google
    case Twitter
    
    func login() {
        switch self {
        case let .Email(user) where user.isValid():
            // login!
            break
        default:
            break
        }
    }
}

我們?cè)诿杜e中定義方法以后在辆,我們的登錄方案就顯得很完整了,而且非常的簡(jiǎn)潔鸦概。

var lp = LoginProvider.Email(user)
lp.login()

關(guān)于這部分內(nèi)容并沒有結(jié)束窗市,因?yàn)榉磳?duì)意見還沒有出場(chǎng)论熙,如果感興趣可以關(guān)注我的下一篇內(nèi)容:這樣做并不怎么好赴肚。

** 原作者非秤看重枚舉能夠把不同的內(nèi)容整合在一起并體現(xiàn)統(tǒng)一的類型踊跟。如果沒有枚舉的幫助,在統(tǒng)一各種不同的登錄SDK上面拳昌,我們確實(shí)需要在協(xié)議和實(shí)現(xiàn)上面花不少功夫炬藤,而且枚舉提供非常棒的特性沈矿,能夠進(jìn)一步抽象業(yè)務(wù)邏輯羹膳,總之swift的枚舉是非常值得點(diǎn)贊的**

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市醒颖,隨后出現(xiàn)的幾起案子图贸,更是在濱河造成了極大的恐慌疏日,老刑警劉巖沟优,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異侵俗,居然都是意外死亡隘谣,警方通過查閱死者的電腦和手機(jī)寻歧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門澄耍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來齐莲,“玉大人铅搓,你說我怎么就攤上這事多望』惩担” “怎么了椎工?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵掰吕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我菱属,道長(zhǎng)纽门,這世上最難降的妖魔是什么膜毁? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任杂瘸,我火速辦了婚禮败玉,結(jié)果婚禮上运翼,老公的妹妹穿的比我還像新娘。我一直安慰自己悠夯,他們只是感情好沦补,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著产舞,像睡著了一般捧弃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瞬场,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天妆艘,我揣著相機(jī)與錄音幌陕,去河邊找鬼。 笑死心例,一個(gè)胖子當(dāng)著我的面吹牛止后,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播古戴,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼始锚!你這毒婦竟也來了瞧捌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤典蝌,失蹤者是張志新(化名)和其女友劉穎曙砂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骏掀,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸠澈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了截驮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笑陈。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妹笆,死狀恐怖窟坐,靈堂內(nèi)的尸體忽然破棺而出徙菠,到底是詐尸還是另有隱情萍摊,我是刑警寧澤歇终,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布疾渣,位于F島的核電站吊圾,受9級(jí)特大地震影響檀何,放射性物質(zhì)發(fā)生泄漏垛孔。R本人自食惡果不足惜贩毕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一规辱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捏肢,春花似錦勾拉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)毕贼。三九已至待秃,卻和暖如春惹悄,著一層夾襖步出監(jiān)牢的瞬間莉给,已是汗流浹背曼玩。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工肿孵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贯吓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓漓帅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子湾盒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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