Swift 2 if case 用法

Swift 2: Pattern Matching with “if case”

Posted on June 20th, 2015

While looking through slides for What’s New in Swift again, I’ve decided to instead play around with and write down the new Swift 2 idioms here for easy reference for myself (and hopefully others). I’m going to start with Pattern Matching with if case.

The Setup

Let’s say you’re making a Sign In Form in your app. You’ll have the following fields:

1
2
3
4
5
6
enum SignUpFormField {
     case FirstName ( String )
     case LastName ( String )
     case EmailAddress ( String )
     case DOB ( NSDate )
}

And of course, as the user enters his or her Date of Birth, you want to show them that they were born before Taylor Swift if that is actually the case. Taylor Swift’s birthday is just a constant in your app:

1
2
3
4
5
6
7
8
let taylorSwiftsBday: NSDate = {
     let gregorianCalendar = NSCalendar (calendarIdentifier: NSCalendarIdentifierGregorian )
     let dateComponents = NSDateComponents ()
     dateComponents.day = 13
     dateComponents.month = 12
     dateComponents.year = 1989
     return gregorianCalendar?.dateFromComponents(dateComponents) ?? NSDate ()
     }()

BS2 (Before Swift 2)

So now, it’s time to write the function to compare the user’s birthday to Taylor Swift’s birthday. BS2, you might have done it as follows:

1
2
3
4
5
6
7
8
9
10
func bornBeforeTaylorSwift(signUpFormField: SignUpFormField ) {
 
     switch signUpFormField {
     case . DOB ( let otherBday)
         where taylorSwiftsBday.compare(otherBday) == . OrderedDescending :
         print ( "Fun fact: You were born before Taylor Swift!" )
     default :
         break
     }
}

Notice the need for a full on switch statement / syntax, and the default case used to do nothing.

Swift 2

These issues mentioned above been solved in Swift 2 with a much simpler pattern matching “if case”:

1
2
3
4
5
6
7
8
func bornBeforeTaylorSwift(signUpFormField: SignUpFormField ) {
 
     if case . DOB ( let otherBday) = signUpFormField
         where taylorSwiftsBday.compare(otherBday) == . OrderedDescending
     {
         print ( "Fun fact: You were born before Taylor Swift!" )
     }
}

Advanced Pattern Matching

Note that you can use the usual advanced pattern matching techniques in the “if case” statement that you’ve probably used in switch statements:

1
2
3
4
5
let numberOfTaylorSwiftSongsFavorited = 93
 
if case 0...225 = numberOfTaylorSwiftSongsFavorited {
     print ( "this is a valid number of favorited Taylor Swift Songs" )
}

I personally still have to get my brain to think of this way of writing my code naturally, but I’m sure it’ll come with practice and lots of refactoring!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值