1. 程式人生 > >穿梭在C/OC/Swift中的列舉

穿梭在C/OC/Swift中的列舉

最近在github上看見一篇<<招聘一個靠譜的iOS>>,看了看裡面的試題,都是些很基礎又很底層的東西,當然現在還再學習中,能從微博@iOS程式犭袁 所提供的答案中學習到很多之前不知道的知識。現在才察覺到,原來自己的所需要學習的還有很多很多,和這些大牛相比,更是渣渣都不是啊!而且出這套題的”孫源” ,就職於百度,而且還是90後,想想自己一個80後,真的很差,好了,不多說這些,從現在努力向前就好了!

其中第一道題就是有列舉(ENUM)規範寫法的問題,正巧今天又在列舉上碰上問題,所以就簡單總結了下列舉相關的簡單東西。

當然,下面的問題,我就只總結關於列舉。

enter image description here

修改完的程式碼:

修改方法有很多種,現給出一種做示例:

// .h檔案
// 修改完的程式碼,這是第一種修改方法,後面會給出第二種修改方法

    typedef NS_ENUM(NSInteger, CYLSex) {
        CYLSexMan,
        CYLSexWoman
    };

    @interface CYLUser : NSObject<NSCopying>

    @property (nonatomic, readonly, copy) NSString *name;
    @property (nonatomic, readonly, assign
) NSUInteger age; @property (nonatomic, readonly, assign) CYLSex sex; - (instancetype)initWithName:(NSString *)name age:(NSUInteger)age sex:(CYLSex)sex; + (instancetype)userWithName:(NSString *)name age:(NSUInteger)age sex:(CYLSex)sex; @end

enum建議使用 NS_ENUMNS_OPTIONS 巨集來定義列舉型別,參見官方的

Adopting Modern Objective-C 一文:

// 定義性別的列舉 這樣可能就比較嚴謹
typedef NS_ENUM(NSInteger, CYLUserGender) {
    CYLUserGenderUnknown,
    CYLUserGenderMale,
    CYLUserGenderFemale,
    CYLUserGenderNeuter
};

提供問題答案大神微博 http://weibo.com/luohanchenyilong/
提供問題答案大神的github https://github.com/ChenYilong

  • 常見列舉型別定義
typedef enum
{
    East,
    South,
    West,
    North
}Direction;
  • 在iOS6和Mac OS 10.8以後Apple引入了兩個巨集來重新定義這兩個列舉型別,實際上是將enum定義和typedef合二為一,並且採用不同的巨集來從程式碼角度來區分。
  • 從列舉定義來看,NS_ENUM和NS_OPTIONS本質是一樣的,僅僅從字面上來區分其用途。NS_ENUM是通用情況,NS_OPTIONS一般用來定義具有位移操作或特點的情況(bitmask)。
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {  
        UIViewAnimationTransitionNone,//預設從0開始  
        UIViewAnimationTransitionFlipFromLeft,  
        UIViewAnimationTransitionFlipFromRight,  
        UIViewAnimationTransitionCurlUp,  
        UIViewAnimationTransitionCurlDown,  
    };  

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {  
        UIViewAutoresizingNone                 = 0,  
        UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,  
        UIViewAutoresizingFlexibleWidth        = 1 << 1,  
        UIViewAutoresizingFlexibleRightMargin  = 1 << 2,  
        UIViewAutoresizingFlexibleTopMargin    = 1 << 3,  
        UIViewAutoresizingFlexibleHeight       = 1 << 4,  
        UIViewAutoresizingFlexibleBottomMargin = 1 << 5  
    }; 

這兩個巨集的定義在Foundation.framework的NSObjCRuntime.h中

#if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))  
#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type  
#if (__cplusplus)  
#define NS_OPTIONS(_type, _name) _type _name; enum : _type  
#else  
#define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type  
#endif  
#else  
#define NS_ENUM(_type, _name) _type _name; enum  
#define NS_OPTIONS(_type, _name) _type _name; enum  
#endif  

Swift中的列舉相對於C語言變化還是很大的

寫到這裡發覺自己的功底還是不行,然後又去看了大牛的幾篇文章,感覺自己再怎麼總結,也沒有人家的深度與廣度,還不如趁這個時間去多學習學習呢!

// Swift 中簡單使用列舉 
enum RequsetMethod: String {
    case GET = "GET"
    case POST = "POST"
}