内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

Swift踩到Enum坑

2017-08-12 19:19 出处:清屏网 人气: 评论(0

今天,天气晴朗,阳光明媚,我像往常一样赖床赖到了九点半,然后在最后一遍起床闹钟的催促声中穿起了衣服,飞一般地冲出了出租屋,蹬上小区门口的小黄,一路冲刺,在即将迟到的前 1s 到达了工位,和平的日常呢。

熟练地打开 XCode(我为什么这么熟练呢...)启动项目,开始继续完成产品大大昨天下达的任务。这时,一个枚举进入了我的视野范围内,枚举常量数据类型是 NSUInteger,哼哼,用表驱动法结合 rawValue 的方式,就能优雅地实现这个需求了,完美。

然而,跑了一下居然发生了运行时错误炸掉了...没道理啊,这也能炸...

EyreFree 眉头一皱,发现事情并不简单

点开这个枚举类型,仔细观察了起来...然后发现了一个坑...(应该是我年少无知...

下面,我带着大家一起跳进这个坑...哦不,一起复现一下这个问题:

  1. 首先,我们需要新建一个 OC 的 Pod 库,然后在其中定义一个枚举类型,指定枚举值从 2 开始(反正不要是默认的 0 就行),大概这个样子就行了:
#import <Foundation/Foundation.h>

typedef NS_ENUM(NSUInteger, TestEnum) {
    TestEnumA = 2,
    TestEnumB,
    TestEnumC,
    TestEnumD,
    TestEnumE,
};

typedef TestEnum EFTestEnumType;

1

  1. 然后,我们再建一个新的 Swift 工程(没错,我司项目是 Swift 的...),在其中引入第一步建好的 CocoaPods 库。到这里,我们可以随便找个地方编写如下测试代码:
print("\(EFTestEnumType.A.rawValue)")

先不要执行蛤,大家按住 command 键点击 EFTestEnumType 进入类型定义可以看到如下代码:

public enum TestEnum : UInt {
    case A
    case B
    case C
    case D
    case E
}
public typealias EFTestEnumType = TestEnum

注意到了么,这里通过 Pod 库中的原始 OC 代码转化出的中间 Swift 代码的枚举中,并没有指定枚举值的起始值。

2

  1. 然后编译运行,观察测试代码的输出会发现,EFTestEnumType.A.rawValue 的值的确是 2...所以,我在主工程中查看了某个枚举类型的定义,而没有注意到 Pod 库中枚举的原始定义是指定了枚举值的起始值的(很好奇为啥这里不一样,搞这么多幺蛾子...),然后就炸了,数组下标越界,初始化失败,随便来一个都会炸掉了...

小伙伴们看懂了么...(嘛,如果这是常识的话...请告诉我我好删掉这篇水文...逃...

PS: 文中所用代码可以在 https://github.com/EyreFree/EFEnumPitDemo 找到。

分享给小伙伴们:
本文标签: EnumSwift

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号