天天看點

Swift講解專題五——集合類型(一)

一、引言

       本系列專題是我通過閱讀Swift2.2語言開發文檔,翻譯總結加上自己的了解整理而成。其中大部分結構和内容都來自開發文檔,有疏漏和錯誤之處,還望更多朋友指出,共同交流進步,我的QQ:316045346。

二、從HelloWorld開始

       在學習很多程式設計語言時,都是從HelloWorld入門,下面代碼就是一個完整的HelloWorld程式:

print("Hello, World!")

分析上面代碼,可以發現Swift語言的3個十分明顯的特點:

1.開發者不需要引入輸入輸出相關的函數庫。

2.在編寫代碼時,不需要在語句的結尾處添加分号。

3.全局的代碼就是程式的入口,不需要類似C系語言的main()方法來作為程式入口。

三、常量與變量

       常量和變量是程式設計語言中最基礎的兩類資料類型,常量可以了解為為某個值起一個特定的名字,常量通常提供給開發者用于某些隻指派一次但卻在程式中多處使用的量值。變量也可以進行多次修改。分别使用let和var建立常量和變量。例如:

let letValue = 4

var varValue = 8

varValue = 16

開發者在進行常量和變量的建立時,并不需要制定類型,編譯器與根據第一次指派的類型來推斷出常量或者變量的類型,然而這并不是說Swift語言不嚴格要求變量或常量的類型,一旦編譯器推斷了值的類型,之後開發者若要修改變量,則必須嚴格遵守既定的變量類型,否則編譯器會報錯。

       如果開發者第一次對變量或常量進行的指派不能夠使編譯器正确的推斷出常量或變量的類型,開發者也可以通過冒号後跟類型的方式來強制定義變量或常量的類型,如下:

var varValue:Float = 8

varValue = 16.0

在Swift語言中,不存在隐式轉換的概念,這也是Swift語言更加安全的特性之一,這樣的設計可以保證變量在任何時候類型都被明确的指定。在進行類型轉換時,可以通過類執行個體化的方式進行,示例如下:

//Float值轉成Int

letValue+Int(varValue)

//Int轉為Float

Float(letValue)+varValue

對于在字元串中使用其他類型的變量,Swift語言提供了一種更加便捷的寫法,使用\()的方式來轉換,小括号内為變量的名稱,例如:

var strValue = "Hello"

//Hello16.0

strValue+"\(varValue)"

四、數組與字典

       數組與字典是最常用的兩種資料集合,在Swift語言中,使用[]來建立數組或字典,示例如下:

var array = [1,2,3]

var dic = [1:"one",2:"two",3:"three"]

同Int,Float類型的資料一樣,數組和字典在第一次指派時,也會根據指派的類型來推斷出變量類型,開發者同樣也可以強制指定,如下:

var array:[Int] = [1,2,3]

var dic:[Int:String] = [1:"one",2:"two",3:"three"]

Swift允許建立或者重新指派為空的資料或者字典,但是這有一個前提條件,被指派為空的資料或字典必須是類型确定的,示例如下:

//這樣寫會報錯

//var errorArray = []

//建立空的資料集合

//方式一

var array:[Int] = []

var dic:[Int:String] = [:]

//方式二

var array2 = [Int]()

var dic2 = [Int:String]()

//方式三

var array3 = [1]

var dic3 = [1:"1"]

array3 = []

dic3 = [:]

五、optional類型的值

       在了解optional類型的值之前,我們可以先來看一段C代碼:

int a=1;

if(a){

}else{

}

上面這段代碼對于C語言來說完全沒有問題,當a為非0值時,就代表條件為真,在Swift語言中則不同,if選擇語句中的條件必須為Bool類型的值,是以,對于某些可以為空的值,Swift中提供了optional類型,這種類型相當于對其他實際類型進行了包裝,如果有值,則他拆包後為相應類型的值,如果沒有值,則為空值nil。示例如下:

var optionalString: String? = "Hello"

if optionalString == nil {

在Swift中,當if與let共同使用時,将會構成一種更加奇特的文法方式,這種方式對于處理optional類型的值十分友善,示例如下:

/*

if let 後面指派為optional類型的值有這樣的效果

如果optional的值不為nil 則會走if條件為真的語句塊并且将optional變量的值指派給let常量 可以在if為真的語句塊中使用

如果optional的值為nil 則會走else語句塊 并且name常量被釋放 不能再else塊中使用

*/

if let name=optionalName {

   greeting = "Hello, \(name)"

   print(greeting)

除了if let文法外,還有一種方式可以用來處理optional類型的值,示例如下:

var greeting = "Hello!"

greeting = "Hello" + (optionalString ?? "")

??運算符用來為optional類型的值設定一個預設值,如果optional值為nil,則會使用後面設定的預設值來代替。

       Swift語言的switch語句相比于C系的語言要強大的多,其不隻可以用于判斷整型,其可以處理任意類型的資料,同樣,它也不隻限于比較是否相等的運算,其可以支援各種負責運算,示例如下:

let vegetable = "red pepper"

switch vegetable {

case "celery":

   print("Add some raisins and make ants on a log.")

case "cucumber", "watercress":

   print("That would make a good tea sandwich.")

case let x where x.hasSuffix("pepper"):

   print("Is it a spicy \(x)?")

default:

   print("Everything tastes good in soup.")

如果比對上了一個case,程式會結束switch選擇,各個case之間是互斥的。

六、循環語句

       Swift2.2中,棄用了for i;param;param{}格式的循環語句,提供給開發者使用的循環語句主要有3種。

1.for in語句

for in語句多用于快速周遊字典,示例如下:

let interestingNumbers = [

   "Prime": [2, 3, 5, 7, 11, 13],

   "Fibonacci": [1, 1, 2, 3, 5, 8],

   "Square": [1, 4, 9, 16, 25],

]

var largest = 0

for (kind, numbers) in interestingNumbers {

   for number in numbers {

   //找出最大值

       if number > largest {

           largest = number

       }

   }

print(largest)

在for in循環中可以使用一個索引來指定循環次數,通過這種方式可以實作有序的周遊操作,示例如下:

for i in 0..<10 {

   print(i)

2.while語句

while語句用于條件循環,直到不再滿足某個條件為止,示例如下:

var n = 2

while n < 100 {

   n = n * 2

print(n)

3.repeat {}while語句

repeat{}while語句與C語言中的do{}while作用相同,保證至少循環一次。示例如下:

var m = 2

repeat {

   m = m * 2

} while m < 100

print(m)

繼續閱讀