[Swift]Swift基礎語法

  • 1903
  • 0
  • 2016-03-05

摘要:[Swift]Swift基礎語法

變數與常數

在Swift內的宣告可以分為兩種,宣告變數與宣告常數變數是宣告後仍然可以改變,宣告時以var開頭。常數則是宣告後不可以改變,宣告時以let開頭。在Swift內,編譯器會進行型別推斷,所以可以不需要指定型別,直接給值。但給完值後,就不能再修改型別了。

變數

使用var宣告一個簡單的整數變數,給予初始值後還可以修改值

var myVariable = 10
myVariable = 50

但是給予int初始值後,再設定string物件後,就會產生Error

var myVariable = 10
myVariable = "a"

會產生錯誤訊息: Cannot assign a value of type 'String' to a value of type 'Int'

常數

使用let宣告一個簡單的整數常數

let myConstant = 20

如果想修改常數值,就會產生Error: Cannot assign to value: 'myConstant' is a 'let' constant

let myConstant = 20
myConstant = 30

指定型別的寫法

在變數名或常數名後加上: ,以指定型別

var myVariable: String = "Hello"

Function

使用func關鍵字來宣告一個函式,使用->來指定函式回傳型別。

func sayHello(personName: String) -> String {
    let greeting = "Hello, " + personName + "!"
    return greeting
}

print(sayHello("Anna"))

使用tuple來回傳多個值。

func callAPI(url: String) -> (Int, String) {
    if(checkURL(url)){
        return (200,"OK")
    }
    else{
        return (500,"Error")
    }
}

集合物件 - Arry & Dictionary & Tuples

使用方括號[]來建立Array(陣列)或Dictionary(字典)物件,並使用索引值(index)或鍵值(key)來存取元素(elements)

Arry

//建立一個空的String Array
var arrayA = [String]()

//建立一個String Array,並給予初始值
var arrayB = ["BA","BB","BC"]

//使用append()增加一個元素到Array中
arrayA.append("A")

//使用 += 增加陣列到原始的陣列中
arrayA += ["B","C"]

//使用insert()插入一個元素
arrayA.insert("D",atIndex: 3)

//使用removeLast()移除最後一個元素
arrayA.removeLast()

//使用for 巡覽Array
for item in arrayA{
    print(item)
}

//使用index取得Array元素
print(arrayA[1])

Dictionary

/建立一個空的Dictionary
var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]

//另一種建立方式, key:String value: Int
var dicA = [String: Int]()

//建立一個Dictionary,並給予初始值
var dicB = ["EleA":10,"EleB":20]

//Key不存在則新增一個元素到Dictionary
dicB["EleC"] = 30

//key存在則修改該key值所指定的元素
dicB["EleC"] = 40

//設定nil以移除一個元素
dicB["EleC"] = nil

//使用for 巡覽Dictionary
for (dicKey, dicValue) in dicB{
    print(dicValue)
}

for dicKey in dicB.keys{
    print(dicKey)
}

for dicValue in dicB.values{
    print(dicValue)
}

Tuples

tuples的宣告語法就是以()把多個物件包起來成為一包,透過index就可以使用。因為可以包不同的型別,所以與Array, Dictionary有不同的使用情境。最常見的是如果function想回傳多個值,又不想大費周章的建立一個class時,就可以很簡單地用tuples來達到這個目的。

//建立一個由Int及String組合起來的tuple
let http404Error = (404, "Not Found")

//取得tuple的第一個元素
print(http404Error.0)

//取得tuple的第二個元素
print(http404Error.1)

//建立tuple時,命名個別元素
let http200Status = (statusCode:200, description:"OK")

//使用元素名來取值
print(http200Status.statusCode)
print(http200Status.description)

Subscript

Subscript應該是對應到C#中的Indexer,他可以使用在Class, Structure, Enum上

class BabyToy{
    var toys = ["car","train"]

    subscript(inder: Int) -> String{
        get{
            return toys[inder]
        }
        set{
            toys[inder] = newValue
        }
    }
}

var toyObj = BabyToy()
//使用Subscript取值
print(toyObj[0])
//使用Subscript設值
toyObj[0] = "tiger"

流程控制

使用ifswitch來進行條件操作,使用for-inforwhiledo-while來進行迴圈。包裹條件和迴圈變數的括號可以省略,但是語句體的大括號則不可以省略。

for 迴圈

for var index = 0; index < 3; ++index {
    print("index is \(index)")
}
// index is 0
// index is 1
// index is 2

for - in 迴圈

例中用來進行遍歷的元素是一組使用閉區間運算子(...),表示的從1到5的數字。

for index in 1...5 {
    print("\(index) 乘 5 = \(index * 5)")
}

while 迴圈

var index = 0
while(index<3){
    print("index is \(index)")
    index++
}

列舉

基本的使用方式

//宣告一個方位的enum
enum CompassPoint {
    case North
    case South
    case East
    case West
}

//建立一個CompassPoint型別的enum
var myDirection = CompassPoint.South

//使用switch判別enum內容
func showDirection(inDir: CompassPoint) -> String{
    switch inDir{
    case .North:
        return "北"
    default:
        return "不是北"
    }
}

print(showDirection(myDirection))
//output: 不是北

使用Raw Value

列舉可以設定Raw Value,需要指定其型別。如下例,Raw Value的型別是Int,可以設置第一個Raw Value,剩下的原始值會按照順序賦值。

可以用rawValue屬性取得值,也可以由值再反轉為Enum

enum Planet: Int {
    case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

print(Planet.Earth.rawValue)
//output: 3

var mercucyObj = Planet(rawValue: 1)
print(mercucyObj)
//output: Optional(Planet.Mercury)