1. 程式人生 > 實用技巧 >Swift5.4教程(一)--常量和變數

Swift5.4教程(一)--常量和變數

本次的教程是基於Swift5.4版本

Swift是一個全新的使用者iOS,MacOS,watchOS和tvOS的應用程式語言。如果你有C和Objective-C開發經驗的話,Swift的許多部門會讓你很熟悉。

Swift 為所有 C 和 Objective-C 的型別提供了自己的版本,包括整型值的 Int ,浮點數值的 Double 和 Float ,布林量值的 Bool ,字串值的 String 。如同集合型別中描述的那樣, Swift 同樣也為三個主要的集合型別提供了更高效的版本, Array , Set 和 Dictionary 。

除了我們熟悉的型別之外,Swift還增加了Objective-C 中沒有的型別,元組。元組允許你建立和傳遞一組的資料,你可以用元組當做函式的返回值來返回多個的值

Swift還增加了可選項,用來處理沒有值的情況,它使得Swift更安全,這也充分說明swift是一門型別安全的程式語言,那麼現在讓我們開始swift的程式設計之旅吧

常量和變數

顧名思義,常量的值一旦設定好便不能再被更改,然而變數的值可以在將來被設定成不同的值

宣告常量和變數

常量和變數必須在使用前被申明,使用關鍵字 let 來宣告常量,使用關鍵字 var 來宣告變數。下面是宣告的一個例子

let heigh = 10      //宣告一個常量 不能被修改,否則會編譯錯誤
var weight = 10     //宣告一個變數 後期可以修改

型別標註

你可以在宣告一個常量或者變數的時候提供型別標註,用來確認常量或者變數能夠儲存值的型別。新增型別標註的方式是在常量或者變數的後面加一個冒號,然後加上一個空格,最後加上要使用的型別的名稱。下面舉個例子:

var name: String = "dapeng" //宣告一個String型別的變數name

輸出常量和變數

你可以使用 print(_:separator:terminator:) 函式來列印當前常量和變數中的值。

var name: String = "dapeng"
print(name)
//輸出 dapeng

Swift 使用字串插值 的方式來把常量名或者變數名當做佔位符加入到更長的字串中,然後讓 Swift 用常量或變數的當前值替換這些佔位符。將常量或變數名放入圓括號中並在括號前使用反斜槓將其轉義:

var name: String = "dapeng"
print("\(name) is very good")
//輸出 dapeng is very good

註釋

使用註釋來將不需要執行的文字放入的程式碼當中,作為標記或者你自己的提醒。當 Swift 編譯器在編譯程式碼的時候會忽略掉你的註釋。swift的註釋和c的註釋基本相同,下面是例子

1.單行註釋

// 這是一個註釋

2.多行註釋

/* this is also a comment,
but written over multiple lines */

分號

和許多其他的語言不同,Swift 並不要求你在每一句程式碼結尾寫分號( ; ),當然如果你想寫的話也沒問題。總之,如果你想在一行裡寫多句程式碼,分號還是需要的

let cat = "mao"
var dog = "dog"
var people = "people";var student = "student"

型別安全和型別推斷

Swift 是一門型別安全的語言。型別安全的語言可以讓你清楚地知道程式碼可以處理的值的型別。如果你的一部分程式碼期望獲得 String ,你就不能錯誤的傳給它一個 Int 。

舉個例子,如果你給一個新的常量設定一個 42 的字面量,而且沒有說它的型別是什麼,Swift 會推斷這個常量的型別是 Int ,因為你給這個常量初始化為一個看起來像是一個整數的數字

let meaningOfLife = 42
// meaningOfLife is inferred to be of type Int

因為 Swift 是型別安全的,他在編譯程式碼的時候會進行型別檢查,任何不匹配的型別都會被標記為錯誤。這會幫助你在開發階段更早的發現並修復錯誤。

數值型字面量

整數型字面量可以寫作:

  1. 一個十進位制數,沒有字首
  2. 一個二進位制數,字首是 0b
  3. 一個八進位制數,字首是 0o
  4. 一個十六進位制數,字首是 0x

類型別名

類型別名可以為已經存在的型別定義了一個新的可選名字。用 typealias 關鍵字定義類型別名。

typealias mInt = Int
var age:mInt = 10
var age:Int = 10
//以上兩種age的宣告是等同的

元組

元組把多個值合併成單一的複合型的值。元組內的值可以是任何型別,而且可以不必是同一型別。

在下面的示例中, (404, “Not Found”) 是一個描述了 HTTP 狀態程式碼 的元組。HTTP 狀態程式碼是當你請求網頁的時候 web 伺服器返回的一個特殊值。當你請求不存在的網頁時,就會返回 404 Not Found

let http404Error = (404, "Not Found")
// http404Error is of type (Int, String), and equals (404, "Not Found")

(404, “Not Found”) 元組把一個 Int 和一個 String 組合起來表示 HTTP 狀態程式碼的兩種不同的值:數字和人類可讀的描述。他可以被描述為“一個型別為 (Int, String) 的元組”

任何型別的排列都可以被用來建立一個元組,他可以包含任意多的型別。例如 (Int, Int, Int) 或者 (String, Bool) ,實際上,任何型別的組合都是可以的。

你也可以將一個元組的內容分解成單獨的常量或變數,這樣你就可以正常的使用它們了:

let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
// prints "The status code is 404"
print("The status message is \(statusMessage)")
// prints "The status message is Not Found"

當你分解元組的時候,如果只需要使用其中的一部分資料,不需要的資料可以用下滑線( _ )代替:

let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// prints "The status code is 404"

另外一種方法就是利用從零開始的索引數字訪問元組中的單獨元素:

print("The status code is \(http404Error.0)")
// prints "The status code is 404"
print("The status message is \(http404Error.1)")
// prints "The status message is Not Found"

你可以在定義元組的時候給其中的單個元素命名:

let http200Status = (statusCode: 200, description: "OK")

在命名之後,你就可以通過訪問名字來獲取元素的值了:

print("The status code is \(http200Status.statusCode)")
// prints "The status code is 200"
print("The status message is \(http200Status.description)")
// prints "The status message is OK"

作為函式返回值時,元組非常有用。一個用來獲取網頁的函式可能會返回一個 (Int, String) 元組來描述是否獲取成功。相比只能返回一個型別的值,元組能包含兩個不同型別值,他可以讓函式的返回資訊更有用。

可選項

可以利用可選項來處理值可能缺失的情況。可選項意味著:這裡有一個值,它等於X或者這裡根本沒有值

首先明確的一個概念

  1. Objective-C中的nil:表示缺少一個合法的物件,是指向不存在物件的指標,對結構體、列舉等型別不起作用(會返回NSNotFound)
  2. Swift中的nil:表示任意型別的值缺失,是一個確定的值,要麼是該型別的一個值要麼什麼都沒有(即為nil)

在Swift中Optional(可選型別)是一個含有兩種情況的列舉,None 和 Some(T),用來表示可能有或可能沒有值。任何型別都可以明確宣告為(或者隱式轉換)可選型別。當宣告一個可選型別的時候,要確保用括號給 ? 操作符一個合適的範圍。

  • 可選型別的宣告
var optionalStr: String? = "swift語言可選型別"//宣告可選型別字串,並賦初值
var opStu:Student? //宣告可選opStu物件,賦初值nil

注意:在型別和 ?之間沒有空格

  • 強制解析
    當你確定自定義的可選型別一定有值時,可以使用操作符(!)進行強制解析,拿到資料,歎號表示”我知道一定有值,請使用它”,但是當你判斷錯誤,可選值為nil時使用(!)進行強制解析,會有執行錯誤。
var myValue:String? = nil
myValue="強制解析,一定有值"
if myValue != nil {
print(myValue!)//使用!進行強制解析
}else{
print("字串為nil")
}
  • 可選項繫結
    使用可選繫結,擺脫了頻繁的判斷是否為nil在賦值,但是使用可選繫結(optional binding)來判斷可選型別是否包含值,如果包含就把值賦給一個臨時常量或者變數。可選繫結可以用在if和while語句中來對可選型別的值進行判斷並把值賦給一個常量或者變數。

  • 格式

if let tempStr = someOptional{
tempStr//如果someOptiona有值的話,就會賦值給tempStr,然後使用
}
var myStr:String?
myStr="可選繫結的值"
if  let tempStr = myStr { //如果希望修改tempStr的值,可以定義成var
print(tempStr)
}else{
print("字串為nil")
}

  • 隱式展開可選項
    在最初的宣告時使用?修飾,當你希望它自動解析是可以用!代替?來修飾,這樣在變數使用時就不需要加!來強制拆包,它會自動解析
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark

let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // no need for an exclamation mark

print(implicitString)

備註:教程中有關Int Double Float Bool 型別沒有做詳細的介紹,需要了解的小夥伴可以訪問蘋果開發文件中心檢視相關的文件