久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

Swift 3.0 enum 的靈活使用介紹

這篇文章主要介紹了Swift 3.0 enum 的靈活使用介紹,非常具有實(shí)用價(jià)值,需要的朋友可以參考下

1. 前言

一晃半年了,從之前的順豐優(yōu)選跳槽到現(xiàn)在的閃銀,都沒有時(shí)間好好寫文章,先進(jìn)行自我批評(píng),最近在忙開源項(xiàng)目,在造各種輪子的過程中,深深的體會(huì)到了Swiftenum的便利,直接上代碼。

2. Objective-C 中的enum


typedef NS_ENUM(NSUInteger, UserType) {
  UserTypeStudent,
  UserTypeTeacher,
  UserTypeStaff,
  UserTypeAdministrator,
  UserTypeOther
};

這是一段標(biāo)準(zhǔn)的Objective-C風(fēng)格的枚舉定義,聲明一個(gè)類型為NSUInteger的枚舉UserType,它有什么用呢, 多數(shù)情況下枚舉起的是解釋的作用,何為解釋?
來個(gè)實(shí)例:


  {
    "successful": true,
    "userType": 0 // 可能為其他的值
  }

后臺(tái)返回一串json,userType可能為1~9,踩過坑的猿們都明白,若是直接使用后臺(tái)返回的userType字段進(jìn)行業(yè)務(wù)邏輯的處理,可能會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的尷尬局面,這個(gè)既關(guān)乎代碼規(guī)范,也少給自己挖坑。

推薦的做法是,將返回的userType映射成枚舉,之后代碼中其他地方也可以調(diào)用,后臺(tái)如果userType對(duì)應(yīng)關(guān)系改變,我們也只需改與之對(duì)應(yīng)的枚舉映射

3. Swift 中的enum

使用過Objective-C中的枚舉,我們會(huì)發(fā)現(xiàn),有時(shí)候我們不想用基礎(chǔ)類型的枚舉,比如NSUInteger等等,我們想將typedef NS_ENUM(NSUInteger, UserType)NSUInteger改成NSString,但是系統(tǒng)不支持定義非基礎(chǔ)類型的枚舉,會(huì)報(bào)錯(cuò)is an invaild underlying type,那就導(dǎo)致了枚舉使用不是那么靈活,我們來看看Swift中的枚舉


enum CIBlurStyle: String{
  case extraLight = "extraLight"
  case light   = "light"
  case dark    = "dark"

這是Swift中最基礎(chǔ)的枚舉用法,我們可以指定枚舉的類型,通過CIBlurStyle.extraLight.rawValue可以獲取到枚舉的原始值,此外我們還可以在枚舉中傳遞參數(shù),如:


enum CIBlurHUDType {
  case guide(Bool)
  case info(String)
  case error(Error)
  case other
}


func handleEnum(hudType: CIBlurHUDType) -> Void {
    switch hudType {
        case .guide(let isAutoHide):
          // 
        case .info(let tip):
          // 提示信息
        case .error(let error):
          // 對(duì) `error` 做處理
        default:
          break
        }
}

// 如何使用
handleEnum(.info("這是一段提示文字~"))

let err = NSError.init(domain: "發(fā)生了一些不為人知的錯(cuò)誤", code: 110, userInfo: nil)
handleEnum(.error(err))

4. Swift 中的enum如何靈活使用

4.1 利用enum精簡(jiǎn)代碼

Swift中的enum使用非常方便,實(shí)例:


public enum CIImageOperation {
  case cornerRadius(CGFloat)
  case scale(CGSize)
  case zip(CGFloat)
  case other
}

我們想要造一個(gè)圖片請(qǐng)求庫(kù),下載完可能會(huì)對(duì)圖片進(jìn)行上面枚舉中的處理,不使用enum,我們可能會(huì)聲明很多方法,如:


extensin UIImageView {
  func setImage(with url: URL, cornerRadius: CGFloat) -> Void {}
  func setImage(with url: URL, scaleTo: CGSize) -> Void {}
  func setImage(with url: URL, zip: (Bool, CGFLoat)) -> Void {}
}

來,我們換一種寫法,看著更精簡(jiǎn)


extension UIImageView {
  func setImage(with url: URL, imageOperation: CIImageOperation) -> Void {
    // 下載完圖片對(duì)圖片進(jìn)行處理
    switch imageOperation {
        case .cornerRadius(let cornerRadius):
          // 切圓角
        case .scale(let size):
          // 尺寸縮放
        case .zip(let zipValue):
          // 圖片清晰度的壓縮比例
        default:
          break
        }
  }
}

// 使用
imagView.setImage(with url: "www.codeinventor.club", imageOperation: .cornerRadius(3.0))

4.2 利用enum對(duì)網(wǎng)絡(luò)請(qǐng)求結(jié)果等做簡(jiǎn)單的package操作


enum CIUrlResponse {
  case Result(Any)
  case error(NSError)
}

通常在一個(gè)網(wǎng)絡(luò)請(qǐng)求完畢之后,會(huì)返回一系列response,利用enum可以傳遞參數(shù)的特性,我們可以使用enum對(duì)網(wǎng)絡(luò)請(qǐng)求進(jìn)行包裝,使其更加直觀易懂,如下面這個(gè)func:


func getData(with url: URL) -> CIUrlResponse {}

注:enum 使用時(shí)傳參數(shù),很方便,但還是不建議傳太多參數(shù),或者過于復(fù)雜的Closure

舉個(gè)負(fù)面例子:


enum HUDStyle {
    case loading(Bool, CGFloat, CGFloat, String)
    case other(((Bool) -> ()))
  }

。。。不注釋根本看不懂這堆參數(shù)什么意思

So. Swift中的enum適合傳遞少量參數(shù),或者簡(jiǎn)單的Closure,與function相比,enum承擔(dān)的更多的還是解釋的作用

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持html5模板網(wǎng)。

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

這篇文章主要給大家介紹了關(guān)于RxSwift學(xué)習(xí)教程之類型對(duì)象Subject的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著
這篇文章主要給大家介紹了關(guān)于RxSwift學(xué)習(xí)教程之Observable的相關(guān)資料,文中詳細(xì)的給大家介紹了關(guān)于新建Observable、訂閱Observable和取消訂閱并消除內(nèi)存泄漏等相關(guān)的內(nèi)容,需要的朋友可以
RxSwift是Swift函數(shù)響應(yīng)式編程的一個(gè)開源庫(kù),由Github的ReactiveX組織開發(fā),維護(hù)。下面這篇文章主要給大家介紹了關(guān)于RxSwift學(xué)習(xí)之基礎(chǔ)篇的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需
這篇文章主要為大家詳細(xì)介紹了Swift4.0 Array數(shù)組的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
CATransition動(dòng)畫主要在過渡時(shí)使用,比如兩個(gè)頁(yè)面層級(jí)改變的時(shí)候添加一個(gè)轉(zhuǎn)場(chǎng)效果。CATransition分為兩類,一類是公開的動(dòng)畫效果,一類是非公開的動(dòng)畫效果。這篇文章主要給大家介紹了
近日,iPhone X的發(fā)布在人們?nèi)罕娨鹆撕艽蟮霓Z動(dòng),下面這篇文章主要給大家介紹了關(guān)于利用Swift如何判斷iPhone X機(jī)型的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面
主站蜘蛛池模板: 亚洲一区二区免费看 | 午夜视频一区二区 | 国产一区二区在线免费观看 | 欧美黄色大片在线观看 | 国产精品久久久久久久久久 | 亚洲www啪成人一区二区麻豆 | 亚洲精品一二三区 | 欧美精品二区三区 | 国产成人网 | 国产在线a | 免费在线观看av片 | 久久一区二区三区四区 | 亚洲精品乱码久久久久久按摩观 | 日韩二区三区 | 午夜ww| 成人国产网站 | 啪啪免费 | 在线国产精品一区 | 精品久久久久久久久久久久久久久久久 | 亚洲一区二区久久久 | 亚洲一区二区av | 国产精品欧美一区二区三区不卡 | 欧美一级二级在线观看 | 一区二区三区四区五区在线视频 | 国产福利二区 | 中文字幕亚洲欧美日韩在线不卡 | 黄色小视频入口 | 久久精品99 | 久久99精品久久久久久国产越南 | 亚洲二区在线 | 欧美视频精品 | 精品不卡 | 精品综合视频 | 国产精品一区二 | 激情毛片| 超碰97人人人人人蜜桃 | 精品视频一区二区 | 欧美一级在线免费 | av大全在线 | 亚洲精品一区在线 | 成年人视频在线免费观看 |