Swift 2 if case 用法

Swift 2: Pattern Matching with “if case”

Posted onJune 20th,2015

While looking through slides forWhat’s New in Swiftagain,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 toshow them that they were born before Taylor Swiftif 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 onswitch statement / Syntax,and thedefault case used to do nothing.

Swift 2

These issues mentioned above been solved in Swift 2 with a much simplerpattern 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!

相关文章

Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章。自从苹果发布 Swfit 编程语言,就成为了...
快,快,快!动动您的小手,分享给更多朋友! 苹果去年推出了全新的编程语言Swift,试图让iOS开发更简单...
开发者(KaiFaX) 面向开发者、程序员的专业平台! 和今年年初承诺的一样,苹果贴出了Swift语言的源码,...
本文由@Chun发表于Chun Tips :http://chun.tips/blog/2014/12/11/shi-yong-swift-gou-jian-zi-ding-yi...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...