1. 前言
一晃半年了,從之前的順豐優選跳槽到現在的閃銀,都沒有時間好好寫文章,先進行自我批評,最近在忙開源項目,在造各種輪子的過程中,深深的體會到了Swift
中enum
的便利,直接上代碼。
2. Objective-C 中的enum
typedef NS_ENUM(NSUInteger, UserType) { UserTypeStudent, UserTypeTeacher, UserTypeStaff, UserTypeAdministrator, UserTypeOther};
這是一段標準的Objective-C
風格的枚舉定義,聲明一個類型為NSUInteger
的枚舉UserType
,它有什么用呢, 多數情況下枚舉起的是解釋的作用,何為解釋?
來個實例:
{ "successful": true, "userType": 0 // 可能為其他的值 }
后臺返回一串json
,userType
可能為1~9
,踩過坑的猿們都明白,若是直接使用后臺返回的userType
字段進行業務邏輯的處理,可能會出現牽一發而動全身的尷尬局面,這個既關乎代碼規范,也少給自己挖坑。
推薦的做法是,將返回的userType
映射成枚舉,之后代碼中其他地方也可以調用,后臺如果userType
對應關系改變,我們也只需改與之對應的枚舉映射
3. Swift 中的enum
使用過Objective-C
中的枚舉,我們會發現,有時候我們不想用基礎類型的枚舉,比如NSUInteger
等等,我們想將typedef NS_ENUM(NSUInteger, UserType)
的NSUInteger
改成NSString
,但是系統不支持定義非基礎類型的枚舉,會報錯is an invaild underlying type
,那就導致了枚舉使用不是那么靈活,我們來看看Swift
中的枚舉
enum CIBlurStyle: String{ case extraLight = "extraLight" case light = "light" case dark = "dark"
這是Swift
中最基礎的枚舉用法,我們可以指定枚舉的類型,通過CIBlurStyle.extraLight.rawValue
可以獲取到枚舉的原始值,此外我們還可以在枚舉中傳遞參數,如:
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: "發生了一些不為人知的錯誤", 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對網絡請求結果等做簡單的package操作
enum CIUrlResponse { case Result(Any) case error(NSError)}
通常在一個網絡請求完畢之后,會返回一系列response
,利用enum
可以傳遞參數的特性,我們可以使用enum對網絡請求進行包裝,使其更加直觀易懂,如下面這個func:
func getData(with url: URL) -> CIUrlResponse {}
注:enum 使用時傳參數,很方便,但還是不建議傳太多參數,或者過于復雜的Closure
舉個負面例子:
enum HUDStyle { case loading(Bool, CGFloat, CGFloat, String) case other(((Bool) -> ())) }
。。。不注釋根本看不懂這堆參數什么意思
So. Swift中的enum適合傳遞少量參數,或者簡單的Closure,與function相比,enum承擔的更多的還是解釋的作用
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。
新聞熱點
疑難解答