国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Swift > 正文

Swift 3.0 enum 的靈活使用介紹

2020-03-09 17:45:19
字體:
供稿:網(wǎng)友

1. 前言

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

2. Objective-C 中的enum

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

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

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

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

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

3. Swift 中的enum

使用過Objective-C中的枚舉,我們會發(fā)現(xiàn),有時候我們不想用基礎(chǔ)類型的枚舉,比如NSUInteger等等,我們想將typedef NS_ENUM(NSUInteger, UserType)NSUInteger改成NSString,但是系統(tǒng)不支持定義非基礎(chǔ)類型的枚舉,會報錯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):          // 對 `error` 做處理        default:          break        }}// 如何使用handleEnum(.info("這是一段提示文字~"))let err = NSError.init(domain: "發(fā)生了一些不為人知的錯誤", code: 110, userInfo: nil)handleEnum(.error(err))

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

4.1 利用enum精簡代碼

Swift中的enum使用非常方便,實例:

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

我們想要造一個圖片請求庫,下載完可能會對圖片進行上面枚舉中的處理,不使用enum,我們可能會聲明很多方法,如:

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 {}}

來,我們換一種寫法,看著更精簡

extension UIImageView {  func setImage(with url: URL, imageOperation: CIImageOperation) -> Void {    // 下載完圖片對圖片進行處理    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對網(wǎng)絡(luò)請求結(jié)果等做簡單的package操作

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

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

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

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

舉個負面例子:

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 班戈县| 湖北省| 波密县| 德昌县| 岑溪市| 米脂县| 聂荣县| 霍城县| 兴化市| 崇义县| 藁城市| 邳州市| 安顺市| 宽甸| 如东县| 韶关市| 化州市| 林芝县| 马龙县| 通江县| 历史| 夹江县| 绥芬河市| 普安县| 抚宁县| 武邑县| 安陆市| 龙门县| 天等县| 彭水| 班玛县| 武威市| 织金县| 宁化县| 增城市| 古丈县| 博野县| 靖江市| 东乡| 崇州市| 兴安盟|