Swift 3.0 enum 的靈活使用介紹
1. 前言
一晃半年了,從之前的順豐優(yōu)選跳槽到現(xiàn)在的閃銀,都沒(méi)有時(shí)間好好寫(xiě)文章,先進(jìn)行自我批評(píng),最近在忙開(kāi)源項(xiàng)目,在造各種輪子的過(guò)程中,深深的體會(huì)到了Swift
中enum
的便利,直接上代碼。
2. Objective-C 中的enum
typedef NS_ENUM(NSUInteger, UserType) { UserTypeStudent, UserTypeTeacher, UserTypeStaff, UserTypeAdministrator, UserTypeOther };
這是一段標(biāo)準(zhǔn)的Objective-C
風(fēng)格的枚舉定義,聲明一個(gè)類(lèi)型為NSUInteger
的枚舉UserType
,它有什么用呢, 多數(shù)情況下枚舉起的是解釋的作用,何為解釋?
來(lái)個(gè)實(shí)例:
{ "successful": true, "userType": 0 // 可能為其他的值 }
后臺(tái)返回一串json
,userType
可能為1~9
,踩過(guò)坑的猿們都明白,若是直接使用后臺(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
使用過(guò)Objective-C
中的枚舉,我們會(huì)發(fā)現(xiàn),有時(shí)候我們不想用基礎(chǔ)類(lèi)型的枚舉,比如NSUInteger
等等,我們想將typedef NS_ENUM(NSUInteger, UserType)
的NSUInteger
改成NSString
,但是系統(tǒng)不支持定義非基礎(chǔ)類(lèi)型的枚舉,會(huì)報(bào)錯(cuò)is an invaild underlying type
,那就導(dǎo)致了枚舉使用不是那么靈活,我們來(lái)看看Swift
中的枚舉
enum CIBlurStyle: String{ case extraLight = "extraLight" case light = "light" case dark = "dark"
這是Swift
中最基礎(chǔ)的枚舉用法,我們可以指定枚舉的類(lèi)型,通過(guò)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 {} }
來(lái),我們換一種寫(xiě)法,看著更精簡(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)行包裝,使其更加直觀(guān)易懂,如下面這個(gè)func:
func getData(with url: URL) -> CIUrlResponse {}
注:enum 使用時(shí)傳參數(shù),很方便,但還是不建議傳太多參數(shù),或者過(guò)于復(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í)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
swift相冊(cè)相機(jī)的權(quán)限處理示例詳解
在iOS7以后要打開(kāi)手機(jī)攝像頭或者相冊(cè)的話(huà)都需要權(quán)限,在iOS9中更是更新了相冊(cè)相關(guān)api的調(diào)用,那么下面這篇文章主要給大家介紹了關(guān)于swift相冊(cè)相機(jī)權(quán)限處理的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下。2017-10-10swift中自定義正則表達(dá)式運(yùn)算符=~詳解
這篇文章主要給大家介紹了關(guān)于swift中自定義正則表達(dá)式運(yùn)算符=~的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12Swift簡(jiǎn)單快速的動(dòng)態(tài)更換app圖標(biāo)AppIcon方法示例
這篇文章主要為大家介紹了Swift動(dòng)態(tài)更換app圖標(biāo)AppIcon的簡(jiǎn)單快速方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Swift中通知中心(NotificationCenter)的使用示例
這篇文章主要給大家介紹了關(guān)于Swift中通知中心(NotificationCenter)使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10swift控件工廠(chǎng)類(lèi)的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了swift控件工廠(chǎng)類(lèi)的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09SwiftUI中@ViewBuilder的相關(guān)知識(shí)點(diǎn)解密
IOS開(kāi)發(fā)目前最主流的框架當(dāng)屬SwiftUI了,這篇文章主要給大家介紹了關(guān)于SwiftUI中@ViewBuilder的一些相關(guān)知識(shí)點(diǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07Swift實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01iOS中Swift指觸即開(kāi)集成Touch ID指紋識(shí)別功能的方法
隨著移動(dòng)支付時(shí)代的到來(lái),Touch ID 指紋驗(yàn)證迅速被支付寶,微信錢(qián)包普及,相信各位朋友使用后也大呼方便。下面給大家分享iOS中Swift指觸即開(kāi)集成Touch ID指紋識(shí)別功能的方法,一起看看吧2017-03-03Swift?中?Opaque?Types學(xué)習(xí)指南
這篇文章主要為大家介紹了Swift?中?Opaque?Types學(xué)習(xí)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04