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!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。