c语言 switch 枚举,Enum 搭配 Switch 使用的心得 - 囧

在 Objective-C 裡面我會定義一組 NS_ENUM 用來把 table view 中的 section index 標示用途,換到 Swift 之後也想要用這個方式做,但是嘗試之後發現結果好噁心 ...

In Objective-C

在 Objective-C 之中,覺得渾然天成

定義NS_ENUM

typedef NS_ENUM(NSInteger, DemoEnum) {

DemoEnumZero = 0,

DemoEnumOne = 1,

DemoEnumTwo = 2

};

情境設定在 table view 相關的 data source 或 delegate methods 使用,會接到一個 section index :

搭配switch使用

NSInteger section = indexPath.section

switch (0) {

case DemoEnumZero:

NSLog(@"0");

break;

case DemoEnumOne:

NSLog(@"1");

break;

case DemoEnumTwo:

NSLog(@"2");

break;

default:

break;

}

看起來還滿 OK 的,

但是到 Swift 之後世界就變了 ´・ω・`

In Swift

來到 Swift ,先定義 raw value 型態為 Int 的 enum

enum DemoEnum: Int {

case Zero = 0

case One = 1

case Two = 2

}

當 enum 型態為 Int 時,指定第一個值之後,後面的值會自己遞增上去,因此這裡也是可以不用寫後面兩個 cases 的 raw values

這時候如果用一樣的寫法:

let section:Int = indexPath.section

switch section {

case DemoEnum.Zero:

println("0")

break

default

break

}

馬上就會看到 Xcode 在抱怨:

aae36800ca8203f5cc4c0166c2f8d042.png

Enum case pattern cannot match values of the non-enum type 'Int'

說我 case 的型態和要比較的型態不一樣,而無法讓我編譯

到這邊為止,如果有看過文件,就會知道問題出在哪邊, 是要拿 enum 的 raw value 來比較,也就是應該要寫成這樣

case DemoEnum.Zero.rawValue:

這時候眉頭皺了一下,心裡想著這是什麼鬼東東,如果要用的話不是就變成 ...

switch section {

case DemoEnum.Zero.rawValue:

println("0")

case DemoEnum.One.rawValue:

println("1")

case DemoEnum.Two.rawValue:

println("2")

default

}

寫完之後,手停下來盯著每個 case 後面都要掛的 .rawValue 看,覺得非常噁心

看來是不能這樣寫,寫完都覺得會討厭自己

後來就是著把取得 raw value 這件事情分離出去一個 method

func fetchRaw(theEnum: DemoEnum) -> Int {

return theEnum.rawValue

}

原本的 switch-case 就可以變成這樣,也至少比較易讀了

switch section {

case fetchRaw(.Zero):

println("0")

case fetchRaw(.One):

println("1")

case fetchRaw(.Two):

println("2")

default

}

如果有什麼建議或疑問,歡迎在下方留言討論 '3`y

同步發佈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值