Swift 語言入門(二)變數與常數 << 前情 控制流程
- if
- for 與 for-in
- while 與 do while
- switch
- 控制轉移語句 (control transfer statements)
if if 在程式開發,條件判斷很常用,用來判斷 是 或 否 兩種狀態。 例如字串變數,是否為空字串,數字是否大於零。 if 語法範例:
if 條件判斷需加上另外的狀態處理,則用 else,例如:
1
2
3
4
5
6
|
if
str ==
""
{
}
else
{
}
|
if、else if、else 綜合範例:
1
2
3
4
5
6
7
8
9
|
if
(index >
0
) {
"index 大於 0"
}
else
if
index ==
0
{
"index 等於 0"
}
else
{
"index is 為負數"
}
|
for 與 for-in for 迴圈 是用來訪問連續的資料,例如你有一筆名冊的資料,想要把每個名字都印出來,就會需要它! for 語法格式:
1
2
3
|
for
初始值; 條件描述; 遞增或遞減值 {
}
|
範例:
1
2
3
4
5
6
7
8
|
for
var i =
0
; i <
3
; i++ {
println(
"var i is \(i)"
)
}
log 輸出 =>
var i is
0
var i is
1
var i is
2
|
for 變數存著尋訪每個在字串的字元 in 字串 範例:
1
2
3
4
5
6
7
8
9
10
|
for
char
in
"Swift"
{
println(
char
)
}
log 輸出 =>
S
w
i
f
t
|
for-in 陣列 for 變數存著尋訪每個在陣列的元素 in 陣列 範例:
1
2
3
4
5
6
7
8
9
10
11
|
let languages = [
"Swift"
,
"Objective-C"
,
"Ruby"
,
"Java"
]
for
lang in languages {
println(lang)
}
log 輸出 =>
Swift
Objective-C
Ruby
Java
|
for-in Range 也可以使用 Range 形態,例如:1..<5 (代表 1 到 5,不包含 5),範例如下:
1
2
3
4
5
6
7
8
9
|
for
i in
1
..<
5
{
println(
"range in \(i)"
)
}
log 輸出 =>
range in
1
range in
2
range in
3
range in
4
|
for-in 字典 當然強大的 for-in 語句,也支援常用的字典型態,搭配 Tuples(元組,多個元素的組合),讓尋訪字典內的 key, value 變得相當直覺!範例如下:
1
2
3
4
5
6
7
8
9
|
let nums = [
"one"
:
1
,
"two"
:
2
,
"three"
:
3
]
for
(str, num) in nums {
println(
"\(str) is \(num)"
)
}
=>
one is
1
two is
2
three is
3
|
while 與 do while while 迴圈與 for 迴圈類似,但 while 迴圈會重複執行他的程式區塊,直到條件為 否。 while 語法格式:
1
2
3
4
5
6
7
8
9
10
|
while
條件 {
}
do
{
}
while
(條件)
|
while 舉個例子,假設我們有個變數 decrease 帶著數值 3,在 while 迴圈內一直遞減,while 條件 大於 0,所以 decrease 在大於 0 之前,while 迴圈 都會一直被執行。
1
2
3
4
5
6
7
8
9
10
11
|
var decrease =
3
while
decrease >
0
{
println(
"decrease \(decrease)"
)
--decrease
}
=>
decrease
3
decrease
2
decrease
1
|
do while 迴圈語句用於,不論如何,迴圈先執行再說,後面 while 條件在來決定要不要繼續執行迴圈。範例如下:
1
2
3
4
5
6
7
8
9
10
11
|
var increase =
0
do
{
println(
"increase \(increase)"
)
++increase
}
while
(increase <
3
)
=>
increase
0
increase
1
increase
2
|
Switch 前面介紹過 if 判斷式,switch 也是判斷式,不過是對於數值的連續判斷,當我們用了很多的 if 或 else if 判斷式時,或許是我們考慮該使用 switch 的時機。 switch 語法格式:
1
2
3
4
5
6
|
switch
變數 {
case
比較的數值:
default
:
"其他數值"
}
|
Switch 數值判斷
1
2
3
4
5
6
7
8
9
10
11
12
13
|
let count =
3
switch
count {
case
1
:
println(
"one"
)
case
2
:
println(
"two"
)
case
3
:
println(
"three"
)
default
:
println(
"other value"
)
}
=> three
|
Switch 字串 switch 語句也支援字串。
1
2
3
4
5
6
7
8
9
10
11
|
var name =
"Apple"
switch
name {
case
"Apple"
:
println(
"Hi Apple!"
)
case
"iPhone"
:
println(
"Hi iPhone!"
)
default
:
println(
"請問你叫什麼名字?"
)
}
=>
Hi Apple!
|
Switch 多數值 case 判斷
1
2
3
4
5
6
7
8
9
10
11
|
let number =
8
switch
number {
case
1
,
3
,
5
,
7
,
9
:
println(
"奇數"
)
case
2
,
4
,
6
,
8
,
10
:
println(
"偶數"
)
default
:
println(
"其他數值"
)
}
=> 偶數
|
Switch 使用 Tuple
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
let point = (
1
,
2
)
switch
point {
case
(
0
,
0
):
println(
"原始起點"
)
case
(_,
0
):
println(
"x=任意值, y=0"
)
case
(
0
, _):
println(
"x=0, y=任意值"
)
case
(
1
,
2
):
println(
"坐標 1, 2"
)
default
:
println(
"其他坐標"
)
}
=>
坐標
1
,
2
|
switch 的 where 條件與 數值綁定 (Value Bindings) Swift 語言的強大 switch 語句還可針對條件作判斷,例如下方範例 where x==y ,並且將傳入的變數綁定到變數 x, y,如let (x,y) 。
1
2
3
4
5
6
7
8
9
10
|
let anotherPoint = (
5
,
5
)
switch
anotherPoint {
case
let (x,y) where x==y:
println(
"正方形"
)
default
:
println(
"矩形"
)
}
=>
正方形
|
Switch in Range switch 當然也支援 Range 型別。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
var num =
9
switch
num {
case
0
...
9
:
println(
"個位"
)
case
10
...
99
:
println(
"十位"
)
case
100
...
999
:
println(
"百位"
)
default
:
println(
"其他"
)
}
=>
個位
|
Switch Enum 在此我們可以看到 Swift語言,對於 Objective-C 的 Enums 修正了冗長的變數名稱,例如改以 .North 點描述,省略了 CompassPoint
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
enum
CompassPoint {
case
North
case
South
case
East
case
West
}
var direction = CompassPoint.South
switch
direction {
case
.North:
println(
"北邊"
)
case
.East:
println(
"東邊"
)
case
.West:
println(
"西邊"
)
case
.South:
println(
"南邊"
)
}
=>
南邊
|
標簽語句 整段的執行結果,尋訪 names 陣列,並且尋訪每個元素的字元,遇到 小寫 a 字元時,跳 (break) 下個元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
let names = [
"Anna"
,
"Alex"
,
"Brian"
,
"Jack"
]
var result =
""
nameLoop:
for
name in names {
charLoop:
for
char
in name {
theSwitch:
switch
char
{
case
"a"
:
break
charLoop
default
:
result +=
char
}
}
}
println(result)
=>
AnnAlexBriJ
|
控制轉移語句 (control transfer statements) 控制轉移語句 (control transfer statements)能讓我們撰寫控制流程時,自由的決定程式要往哪邊跑,Swift 語言有四種控制轉移語句。
- continue
- 在回圈內使用,continue後的內容跳過,並且將繼續執行回圈。
- break
- 在 迴圈 與 while 內使用,將會使程式跳離迴圈。注意與 continue 的差異。
- fallthrough (貫穿)
- 在 switch 語句中使用,因 Swift 語言,不需在 case 寫 break,若有特殊情況需要 fallthrough (貫穿) 兩種或以上的 case 時用到。
- return
- 函式回傳,在執行函式時,若要將運算變數回傳,需使用 return,return 也可回傳 Tuples (元組)。
我們往下來看範例: continue 在 i > 5 之前,都直接把 i 印出,之後呢 加上字串,並且使用 continue 結束這回合,但迴圈還沒結束。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
for
i in
1
...
10
{
if
i >
5
{
println(
"continue \(i)"
)
continue
}
println(i)
}
=>
1
2
3
4
5
continue
6
continue
7
continue
8
continue
9
continue
10
|
break break 脫離迴圈,在 i > 5 的時候,使用 break 結束這個迴圈。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
for
i in
1
...
10
{
if
i >
5
{
println(
"break \(i)"
)
break
}
println(i)
}
=>
1
2
3
4
5
break
6
|
fallthrough 因為 integerToDescribe 是 Int,所以它一定是數字,但未必是質數,如果是質數,則 fallthrough 到 default,因為質數也是數字。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
let integerToDescribe =
5
var integerDescription =
"\(integerToDescribe) 是"
switch
integerToDescribe
{
case
2
,
3
,
5
,
7
,
11
,
13
,
17
,
19
:
integerDescription +=
" 質數, 也是"
fallthrough
default
:
integerDescription +=
" 數字"
}
println(integerDescription)
=>
5
是 質數, 也是 數字
|
return 函式回傳的一些用法,直接回傳數值或變數,亦可回傳 Tuples。
1
2
3
4
5
6
7
8
9
10
|
func sayHelloWorld() -> String
{
return
"Hello World"
}
func http404Error() -> (Int, String)
{
return
(
404
,
"Not Found"
)
}
|
後續 >> Swift 語言入門(四)標準函式 |