資工系同學 / 工程師快速上手的基礎 Swift 語法
--
彼得潘遇到滿多已有一定程式基礎的資工系同學 / 工程師對 iOS App 開發有興趣。他們常問有沒有方法快速上手 Swift 語法,早點開始開發有趣的 App 呢?
Swift 十分強大,有許多的語法和功能要學。除非你天賦異稟,不然全部學完還是需要一點時間。不過它也有許多基本的語法跟其它程式語言類似,只要學會就能開始開發一些簡單的 App。
因此以下彼得潘針對 Swift 基礎語法的部分做了些整理,接下來就讓我們快速認識基礎的 Swift 吧。
大綱
- 宣告 constant(常數)
- 宣告 variable(變數)
- type annotation(宣告常數變數時加上型別)
- string interpolation(字串置換)
- 呼叫 function
- 以型別( ) 產生 instance(實體)
- 加入 framework(函式庫)
- call method(呼叫方法)
- 存取 property(屬性)
- 存取 type property
- 呼叫 type method
- 定義 function
- 定義 class(類別)
- 定義 struct
- if else
- array(陣列)
- for in 迴圈
- while 迴圈
- switch
- 定義 enum
- dictionary(字典)
- 可有可無的 Optional
- initializer(初始化函式)
- 定義 type property & type method
宣告 constant(常數)
使用 let 宣告常數。型別可省略,因為可由內容自動推理型別。
範例
let girlFriend = "小龍女"
常數 girlFriend 儲存女朋友的名字小龍女,girlFriend 的型別自動推理為字串(String)。跟小龍女談戀愛超棒的,希望她能永遠當我們的女朋友,永遠不會變。
宣告 variable(變數)
使用 var 宣告變數。
範例
var height = 179.5
變數 height 儲存彼得潘的身高 179.5,height 的型別自動推理為浮點數(Double)。彼得潘希望自己未來還能長高,height 還能改變,有天能夠變成 180。
type annotation(宣告常數變數時加上型別)
宣告常數變數時額外加上型別名字,語法為冒號加上型別名字。
範例
let girlFriend: String = "小龍女"
var height: Double = 179
var weight: Float = 70.5
var age: Int = 18
var trueHeart: Bool = true
String 是字串,Double & Float 是浮點數,Int 是整數,Bool 可存 true 或 false。
string interpolation(字串置換)
在 ""
裡用 \( )
包含變數(常數), \( )
將被置換成變數(常數)的內容。
範例
var name = "彼得潘"
let star = "水瓶座"
var height = 179.5
var age = 18
let intro = "我是名字是\(name),今年\(age)歲,星座是最棒的\(star),身高\(height)公分"
intro 將儲存字串"我是名字是彼得潘,今年18歲,星座是最棒的水瓶座,身高179.5公分"
。
呼叫 function
function 名加 ( ),( ) 裡可傳入參數。
範例
print("原來你是我最想留住的幸運")
( ) 裡可傳入多個參數,參數間以逗號分隔,有些參數前會保留參數名。以下我們用 3 個參數的 print 說明。
範例
print("我最愛的動物有🐨", "🐧", "🦊", separator: "、", terminator: "......")
程式將印出 我最愛的動物有🐨、🐧、🦊……
。第一個參數是列印的內容,型別 Any…
表示可傳入任何東西,…
表示可傳入多個要列印的內容。當有多個要列印的內容時,第二個參數 separator 是它們之間的分隔字串,第三個參數 terminator 將成為結尾的字串。
以型別( ) 產生 instance(實體)
使用型別( ) 可產生實體(東西)。
範例
let number = Int(2.7)
使用 Int( ) 產生整數,傳入 2.7,得到數字 3。
let loveMessage = String(repeating: "Love You ", count: 3000)
使用 String( ) 產生字串,傳入參數 "Love You "
& 3000
,得到的字串是 3000 個 Love You 。
加入 framework(函式庫)
import 加函式庫名字。
範例
import AVFoundation
加入函式庫 AVFoundation,AVFoundation 定義跟影音播放相關的功能。
call method(呼叫方法)
變數常數的名字 + . + function 名 + (參數)。
範例
var bestManName = "peter"
bestManName.append("是真男人")
呼叫字串的 function append,在 peter
後增加字串是真男人
,bestManName 變成"peter是真男人"
。
存取 property(屬性)
變數常數的名字 + . + 屬性名。
範例
var bestManName = "peter"
bestManName.count
讀取字串的 property count,取得字串的字數。由於 bestManName 是 peter,bestManName.count 將得到 5。
存取 type property
型別名 + . + 屬性名。
範例
Double.pi
Int.max
結果
呼叫 type method
型別名 + . + function 名 + (參數)。
範例
let number = Int.random(in: 1...6)
產生 1 ~ 6 之間的隨機整數。
定義 function
func + 名稱 + ( ),( ) 裡可包含參數,宣告參數的格式為參數名 + : + 參數型別。
範例
func aLittleHappiness(lover1: String, lover2: String) {
print("原來\(lover1)是我最想留住的幸運,原來我們和\(lover2)曾經靠得那麼近")
}
aLittleHappiness(lover1: "Peter", lover2: "Hook")
印出原來Peter是我最想留住的幸運,原來我們和Hook曾經靠得那麼近
。
當 function 會回傳資料時,必須在 ( ) 後加上 -> 回傳型別
,然後以 return
回傳資料。
範例
func aLittleHappiness(lover1: String, lover2: String) -> String {
let message = "原來\(lover1)是我最想留住的幸運,原來我們和\(lover2)曾經靠得那麼近"
return message
}
let message = aLittleHappiness(lover1: "Peter", lover2: "Hook")
message 的內容為"原來Peter是我最想留住的幸運,原來我們和Hook曾經靠得那麼近"
。
補充: function 參數的外部名 & 內部名(argument label & parameter name)
定義 class(類別)
class + 類別名 + { },{ } 裡可包含 property & method,property 以變數常數宣告,method 以 function 定義。
範例
class Baby {
var age = 1
var name = "peter"
let star = "水瓶座"
func sleep(hour: Int, min: Int) {
print("睡了\(hour)小時\(min)分鐘")
}
}
var cuteBaby = Baby()
print(cuteBaby.name)
cuteBaby.sleep(hour: 10, min: 10)
類別可以繼承,以下例子 class SuperBaby: Baby
表示 SuperBaby 繼承 Baby,SuperBaby 將擁有 Baby 的 property & method。
class Baby {
var age = 1
func sleep() {
print("睡到自然醒")
}
}
class SuperBaby: Baby {
var magic = "隱形"
}
var cuteBaby = SuperBaby()
cuteBaby.sleep()
print("寶寶的魔法是\(cuteBaby.magic)")
定義 struct
struct 的語法和功能跟 class 類似。主要差別在 class 是 reference type,struct 是 value type。
範例
struct Baby {
var age = 1
var name = "peter"
let star = "水瓶座"
func sleep(hour: Int, min: Int) {
print("睡了\(hour)小時\(min)分鐘")
}
}
var cuteBaby = Baby()
print(cuteBaby.name)
cuteBaby.sleep(hour: 10, min: 10)
補充: Swift 的 value type 和 reference type
if else
if 後必須接 Bool 型別的資料判斷條件是否成立。
範例
func checkTrueLove(age: Int) {
if age < 30 {
print("你是我的傳說")
} else if age < 50 {
print("你可能是我的傳說")
} else if age < 60 {
print("你有1%的機會成為我的傳說")
} else {
print("你不是我的菜")
}
}
checkTrueLove(age: 25)
印出"你是我的傳說"
。
array(陣列)
可包含多筆資料,以 [ ] 包含 array 的內容,array 型別的寫法為 [成員型別名]。
範例
let idols: [String] = ["劉德華", "梁朝偉", "張智霖"]
print("我最愛的\(idols.count)個男人,第一名是\(idols[0])")
印出我最愛的3個男人,第一名是劉德華
。在 [ ] 傳入數字可存取 array 的成員,數字從 0 開始,因此 idols[0] 是第一筆資料,idols[1] 是第二筆資料。從 array 的 property count 可取得成員的數量。
for in 迴圈
in 後可接數字範圍,迴圈跑的次數將依據數字範圍裡有幾個數字。範圍有 …
和 ..<
兩種表示法,比方 1…10
表示 1 到 10,1..<10
表示 1~9,不包含 10。
範例
var sum = 0
for i in 2...10 {
sum = sum + i
}
print(sum)
迴圈會跑 9 次,sum 為 2加3一路加到 10 的總和。
in 後也可以接陣列,迴圈跑的次數將依據 array 裡有幾個成員。
範例
let names = ["peter", "wendy", "hook", "tinker bell"]
for name in names {
print(name)
}
印出 array names 裡每個成員的名字。迴圈會跑 4 次,第一次時 name 是 peter,第二次時 name 是 wendy。
while 迴圈
範例
var sum = 0
var number = 5
while number < 20 {
sum = sum + number
number = number + 5
}
print(sum)
sum 將等於 30( 5+10+15)。
switch
switch 後可接任何型別的資料,當 case 條件成立時,執行完 case 裡的程式後將離開 switch 的 { },不需要加 break。
範例
func checkRealMan(name: String) {
switch name {
case "Peter":
print("Peter 是真男人")
case "Hook":
print("Hook 不是男人")
default:
print("無法判斷")
}
}
checkRealMan(name: "Peter")
印出Peter 是真男人
。
定義 enum
適合表達清單的成員。
範例
enum Pet {
case dog, cat, rabbit
}
var myPet = Pet.rabbit
補充: enum 的詳細說明。
dictionary(字典)
以 key & value 的方式儲存資料,方便之後用 key 找資料。以 [ ] 包含 dictionary 的內容,dictionary 型別的寫法為 [key 的型別名: value 的型別名]。
範例
var lifeNumberDic: [String: String] = [
"生命靈數1": "創始",
"生命靈數2": "平衡",
"生命靈數3": "創意"
]
lifeNumberDic["生命靈數3"]
在 [ ] 傳入 key 可查詢對應的 value,因此 lifeNumberDic["生命靈數3"]
會得到創意
。
可有可無的 Optional
當變數常數宣告為 optional 時,表示它可以不存東西,使用到問號與驚嘆號的語法。相關說明可參考以下連結。
initializer(初始化函式)
我們可以 init 定義初始化函式,生成實體時將呼叫初始化函式設定屬性的內容。
範例
class Baby {
var age: Int
var name: String
init(age: Int, name: String){
self.age = age
self.name = name
}
init(name:String) {
self.age = 1
self.name = name
}
init() {
self.age = 1
self.name = "Peter"
}
}
var cuteBaby = Baby()
cuteBaby = Baby(name: "Peter")
cuteBaby = Baby(age: 18, name: "Peter")
在 Baby 裡定義三種 init,產生 Baby 時可選擇不同的 init,傳入不同的參數。
定義 type property & type method
以 static 定義可從型別存取的 type property & type method。
範例
class Baby {
var name = ""
var star = ""
static var maxAge = 100
static func createAquariusBaby() -> Baby {
let cuteBaby = Baby()
cuteBaby.name = "peter"
cuteBaby.star = "水瓶"
return cuteBaby
}
}
let maxAge = Baby.maxAge
let cuteBaby = Baby.createAquariusBaby()
Swift 的進階語法
以上大概就是 Swift 比較基礎的部分。覺得意猶未盡,開始慢慢喜歡 Swift 了嗎?想再深入了解它,學習 closure,extension,protocol,generic 等進階技術 ? 沒問題,它的一切秘密都藏在 Apple 的網站 The Swift Programming Language,等著你挖掘 ~。