2016-07-31 08:56:30 huangyongf 阅读数 2008

OC枚举和Swift 枚举


下面介绍一下 OC 枚举和 Swift 枚举的写法!

OC枚举:


         


Swift 枚举:

            


 以上,希望对大家会有所帮助,谢谢!










2019-02-25 20:35:07 wei78008023 阅读数 505

在OC和Swift混编的过程中有很多的细节需要注意。

今天介绍一下在OC文件中声明了一个枚举类型,如何在Swift文件中调用该枚举类型的值。

1.项目工程构建的时候选的是Swift语言,项目名称TestProject。

2.建立一个Swift文件SwiftTestFile.swift 和一个OC的文件 ObjectTestFile.h 和ObjectTestFile.m。

在ObjectTestFile.h 中声明一个枚举类型:

typedef NS_ENUM(NSInteger, YXLabelStyle) {
    YXLabelStyleSingle1_1,
    YXLabelStyleSingle1_2,
    YXLabelStyleSingle1_3,
}

首先必须确认的是枚举的每个值必须是枚举的“名字+后缀”的形式,这是一种规范,不这样在Swift文件中会导致调用不到。

也就是例子中枚举名为“YXLabelStyle”,那么每个值必须是“YXLabelStyle+...”的形式。

3.首先想要Swift调用OC文件及内容,必须有一个桥接文件并把需要调用的OC文件的头文件引入,桥接文件的构建就不多说了,一搜一大把,我们项目中桥接文件为“Bridging-Header.h”。

桥接文件中导入头文件:

#ifndef Bridging_Header_h
#define Bridging_Header_h

#import "ObjectTestFile.h"

#endif /* Bridging_Header_h */

4.这样就可以在Swift文件中调用这个枚举类型的值。

在调用的时候直接使用“YXLabelStyle.single1_1”或者直接“.single1_1”调用即可,这就是为什么要规范的原因。

5.列子:

假设我们有一个YXLabel,自定义实例化方法需要传入该枚举类型的值来确定YXLabel的一些样式和特性,那么我么可以这样:

let label = YXLabel(style: YXLabelStyle.single1_1)

或者直接这样:

let label = YXLabel(style: .single4_1)

 

2015-09-28 01:17:41 qq_27484549 阅读数 1192

最近在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"
}

Swift中枚举的使用,这个不算转载吧!参考此篇文章学习吧!

C中枚举使用,这篇博文我感觉就很详细了!参考此篇博文学习吧!

2016-10-11 16:24:59 qq_30970529 阅读数 405

相比OC中的枚举而言,Swift中的枚举功能更强大,也新增了很多特性,今天就简单的罗列一下。
枚举使用case关键字来定义新的成员,可以一行写但是要以逗号分开也可以多行写。
在Swift中枚举类型有个关联值,对于枚举成员来说它可以有任意类型的关联值:

//定义枚举(关联值)
enum Value {
    //使用关键字case 定义新的枚举成员
    case ValueOne
    case ValueTwo(Int,String)//一个元祖关联值
    case ValueThree(String) //关联值可以变化
    indirect case ValueFour(Value,Value) //关联值类型也可以是枚举本身的类型,但是需要在成员值前添加indirect关键字表示可递归
    case ValueFive(Int),ValueSix(Int),ValueSeven
}

我们在枚举的关联值里面可以保存一些信息,并且在创建枚举对象的时候可以给枚举成员设置关联值。如果枚举成员的关联值类型是枚举本身的类型,那么可以在这个成员变量的前面添加关键字indirect表示可以递归,我们可以利用枚举的递归定义一些表达式。
当我们使用Switch的case分支匹配枚举的成员,如果这个成员有关联值我们可以直接在这个分支里面提取关联值:

func associatedValue(value:Value) ->Int {
    switch value {
    case .ValueFive(let a):
        return a;
    case .ValueSix(let b):
        return b;
    default:
        return 0;
    }
}

上面这个函数就是提取了ValueFive和ValueSix的关联值作为函数的返回值。
下面是用枚举成员给常量和变量赋值,并且做一些匹配:

let five = Value.ValueFive(5)
let six = Value.ValueSix(6)
var test = Value.ValueThree("this is test")
// test = Value.ValueTwo(2, "this is two")
test = Value.ValueFour(five, six)

switch test {
case .ValueOne:
    break
case let .ValueTwo((a,b)):
    print("Int:\(a),String:"+b)
    break
case .ValueThree(let test):
    print(test)
    break
case let .ValueFour(a,b):
    print("求和:\(associatedValue(value: a)+associatedValue(value: b))")
    break
default:
    break
}

经过上面的处理,你可以发现ValueFour这个成员可以简单的代表一个加法运算,它的两个关联值就是两个加数。

枚举的原始值,一个枚举成员的原始值是在定义枚举的时候就指定的是不变的原始值的类型是一样的。枚举的成员的原始值是有个默认值的,如果原始值类型是字符串那么原始值就是成员本身,如果原始值类型是整形那么原始值默认是从0递增的:

//定义有原始值的枚举
enum RawValue:String {
    case One //原始值是不变的,如果是整形原始值默认递增,如果是字符串类型默认是成员名
    case Two = "this is two"
    case Three
}

枚举成员的原始值是可以通过rawValue获取的:

print("One:\(RawValue.One.rawValue);Two:\(RawValue.Two.rawValue)")

我们也可以使用枚举成员的原始值创建一个枚举类型的对象,这个创建出来的对象是一个可选项因为你给的传人参数不一定就是原始值:

//使用原始值创建枚举实例,可以理解为用原始值寻找枚举成员,返回值是个可选项
if let value = RawValue(rawValue: "this is two"){
    print("枚举实例:\(value)")
    switch value {
    case .One:
        print("One原始值:\(value.rawValue)")
        break
    case .Two:
        print("Two原始值:\(value.rawValue)")
        break
    case .Three:
        print("Three原始值:\(value.rawValue)")
        break;
    }
}else {
    print("初始化失败")
}
2017-08-09 00:00:54 a997013919 阅读数 299


C中的枚举


在C语言中,甚至OC等其他高级语言中,都是把enum枚举的值当作是一个int整数来替代

具体可看我的这篇文章:C语言的枚举与宏定义



Swift中的枚举enum


注:本篇文章学习自泊学(boxueio.com)

(PS:Swift更新得真是非常快啊,4个月不到前写的代码,今天打开就提醒有语法要修正…)

1. what:

在Swift中,enum看起来是这样的:

enum Week{
    case MON
    case TUES
    case WED
    case THUR
    case FRI
    case SAT
    case SUN
}

let week1 = Week.MON

或:

enum Subject{
    case Chinese,English,Chemistry,History
}
let mySubject = Subject.Chinese

无论哪种方式,可以在playground看到,当在使用Week.MON时,就已经在访问一个enum的值了,它的case就是它的值本身,无需刻意地定义一个值来代表它。


2. why:

使用enum比使用字符串或数字有很多好处:

1 避免输入错误

2 使用enum类型是安全的,如当使用Week或Subject时,不会发生类型正确,值却没有意义的情况

3. how:

1)enum与switch

如果enum的类型可被推导出,则可在读取值的时候,省掉它类型的名字:

func week(today: Week)
{
    switch today{
    // 因为today可以通过类型推导推出它的类型是Week,所以不用today.MON,而是直接写.MON
    case .MON, .TUES, .WED:
        return
    case .THUR, .FRI, .SAT, .SUN:
        return
    }
}

对于一个enum的switch来说,它的所有的case就是它全部的情况,所以最后不用再写default


2)enum值的表达方式1:raw value原始数值

1. 手动为enum指定值

enum Week:Int{
    case MON   = 2
    case TUES  = 4
    case WED   = 7
    case THUR
    case FRIFRI
    case SAT
    case SUN
}

2. 自动:

如上段代码,当没有手动为后面的THUR、FRI等赋值时,它们将被自动赋值,从上一个值开始递增

3. 访问enum的rawValue:

let week1 = Week.FRI.rawValue
此时为9

4. 用rawValue来访问一个enum的值

let week2 = Week(rawValue: 7)
此时enum值为WED


3)enum值的表达方式2: associated value结合值

1.  给每一个case绑定不同类型的值

enum HTTPAction{
    case GET  // 不关联任何值
    case POST(String)// 关联一个字符串
    case PUT(Int, String)// 关联一个tuple
}

let get = HTTPAction.GET
let post = HTTPAction.POST("hello")
let put = HTTPAction.PUT(1, "world")


2.  通过switch访问enum的结合值associated value

func actionDesc(action: HTTPAction)
{
    switch action
    {
    case .GET:
        print("get")
    case let .POST(msg):// let msg = action
        print("post: \(msg)")
    case .PUT(let num, let name):
        print("put: \(num): \(name)")
    }
}

actionDesc(action: get)
actionDesc(action: post)
actionDesc(action: put)







Swift 中调用OC枚举

阅读数 151

没有更多推荐了,返回首页