原創|使用教程|編輯:龔雪|2014-06-05 10:44:13.000|閱讀 7818 次
概述:本文為Swift編程語言中文教程第一部分,講解Swift的基礎數據類型。Swift是蘋果公司在WWDC2014發布的一門編程語言,與Objective-C相比,對學習新手比較友好。慧都控件網根據官方教程以及網上中文資源整理了Swift編程語言中文教程,希望幫助想要學習Swift的朋友,由于技術有限,可能有不足的地方,希望大家指正。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
雖然Swift是一個為開發iOS和OS X app設計的全新編程語言,但是Swift的很多特性還是跟C和Objective-C相似。
Swift也提供了與C和Objective-C類似的基礎數據類型,包括整形Int、浮點數Double和Float、布爾類型Bool以及字符串類型String。Swift還提供了兩種更強大的基本集合數據類型,Array和Dictionary,更詳細的內容可以參考:(中文教程:集合類型)。
跟C語言一樣,Swift使用特定的名稱來定義和使用變量。同樣,Swift中也可以定義常量,與C語言不同的是,Swift中的常量更加強大,在編程時使用常量能夠讓代碼看起來更加安全和簡潔。
除了常見的數據類型之外,Swift還集成了Objective-C中所沒有的“元組”類型,可以作為一個整體被傳遞。元組也可以成為一個函數的返回值,從而允許函數一次返回多個值。
Swift還提供了可選類型,用來處理一些未知的不存在的值。可選類型的意思是:這個值要么存在,并且等于x,要么根本不存在。可選類型類似于Objective-C中指針的nil值,但是nil只對類(class)有用,而可選類型對所有的類型都可用,并且更安全。可選類型是大部分Swift新特性的核心。
可選性類型只是Swift作為類型安全的編程語言的一個例子。Swift可以幫助你更快地發現編碼中的類型錯誤。如果你的代碼期望傳遞的參數類型是String的,那么類型安全就會防止你錯誤地傳遞一個Int值。這樣就可以讓編程人員在開發期更快地發現和修復問題。
1、常量和變量
常量和變量由一個特定名稱來表示,如maximumNumberOfLoginAttempt 或者 welcomeMessage。常量所指向的是一個特定類型的值,如數字10或者字符”hello”。變量的值可以根據需要不斷修改,而常量的值是不能夠被二次修改的。
常量和變量的聲明
常量和變量在使用前都需要聲明,在Swift中使用let關鍵詞來聲明一個常量,var關鍵詞聲明一個變量。如下面例子
let maximumNumberOfLoginAttempts = 10 var currentLoginAttempt = 0
以上代碼可以理解為:
聲明一個叫maximumNumberOfLoginAttempts的值為10的常量。然后聲明一個變量currentLoginAttempt初始值為0。
在這個例子中,最大的登錄嘗試次數10是不變的,因此聲明為常量。而已經登錄的嘗試次數是可變的,因此定義為變量。也可以在一行中聲明多個變量或常量,用,號分隔:
var x = 0.0, y = 0.0, z = 0.0
注意:如果一個值在之后的代碼中不會再變化,應該用let關鍵詞將它聲明為常量。變量只用來存儲會更改的值。
類型注解
在聲明常量和變量時,可以使用注解來注明該變量或常量的類型。使用:號加空格加類型名在變量或常量名之后就可以完成類型注解。下面的例子就是聲明了一個變量叫welcomeMessage,注解類型為字符串String:
var welcomeMessage: String
分號:在這的作用就像是在說:…是…類型的,因此上述代碼可以理解為:
聲明一個叫welcomeMessage的變量,它的類型是String
這個類型注解表明welcomeMessage變量能無誤地存儲任何字符串類型的值,比如welcomeMessage = “hello”
注:實際編程中很少需要使用類型注解,定義常量或者變量的時候Swift已經根據初始化的值確定了類型信息。Swift幾乎都可以隱式的確定變量或常量的類型,詳見: 。而上面的welcomeMessage的例子中,初始化值沒有被給出,所以更好的辦法是指定welcomeMessage變量的類型而不是讓Swift隱式推導類型。
常量和變量的命名
Swift中可以使用幾乎任何字符來作為常量和變量名,包括Unicode,比如:
let π = 3.14159 let 你好 = "你好世界" let = "dogcow"
但是名稱中不能含有數學符號,箭頭,無效的Unicode,橫線-和制表符,且不能以數字開頭,盡管數字可以包含在名稱里。一旦完成了聲明,就不能再次聲明相同名稱的變量或常量,或者改變它的類型。變量和常量也不能互換。
注:如果你想用Swift保留字命名一個常量或者變量,你可以用 ` 符號把命名包圍起來。盡管如此,除非處于特別的意圖,盡量不要使用保留字作為變量/常量名。
可以改變變量的值為它聲明的類型的其它值,如下的例子里,變量friendlyWelcome的值從“Hello!”被修改為”Bonjour!”:
var friendlyWelcome = “hello!” friendlyWelcome = “Bonjour!” // friendlyWelcome is now “Bonjour!”
與變量不同的是,常量的值一旦確定就不能修改。如果想嘗試改變一個常量的值,編譯代碼時就會報錯
let languageName = “Swift”
languageName = “Swift++”
// this is a compile-time error – languageName cannot be changed
輸出常量和變量
Swift使用println來輸出變量或者常量:
println(friendlyWelcome) // prints “Bonjour!”
println是一個全局函數,用來輸出一個值,最后輸出一個換行。在Xcode中,println輸出在控制臺中。print函數也類似,只不過最后不會輸出換行。
println函數一般輸出一個字符串
println("This is a string") // prints "This is a string"
println函數還可以格式化輸出一些日志信息,就像是Cocoa中NSLog函數的行為一樣,可以包括一些常量和變量本身。Swift在字符串中插入變量名作為占位符,使用反斜杠\和小括號()來提示Swift替換變量/常量名為其實際的值,如:
println(“The current value of friendlyWelcome is (friendlyWelcome)”) // prints “The current value of friendlyWelcome is Bonjour!”
注:關于格式化字符的詳見
2、注釋
不參與編譯的語句稱為注釋,注釋可以提示你代碼的意圖。Swift中的注釋和C語言中的一樣,有單行注釋
//this is a comment
多行注釋,使用/和/分隔
/* this is also a comment, but written over multiple lines */
和C語言不同的是,多行注釋可以嵌套,你需要先開始一個多行注釋,然后開始第二個多行注釋,關閉注釋的時候先關閉第二個,然后是第一個。如下
/* this is the start of the first multiline comment /* this is the second, nested multiline comment */ this is the end of the first multiline comment */
這樣可以方便地在大段已注釋的代碼塊中繼續添加注釋
3、分號
和其它一些編程語言不同,Swift不需要使用分號 ; 來分隔每一個語句。當然你也可以選擇使用分號,或者你想在一行中書寫多個語句。
let cat = ""; println(cat) // prints ""
4、整數
整數就是像42和-23這樣不帶分數的數字,包括有符號(正數,負數,0)和無符號(正數,0)。Swift提供了8、16、32和64位的數字形式,和C語言類似,可以使用8位的無符號整數UInt8,或者32位的整數Int32.像其他Swift類型一樣,這些類型名的首字母大寫。
整數邊界
使用min或max值來獲取該類型的最大最小值,如:
let minValue = UInt8.min // minValue is equal to 0, and is of type UInt8 let maxValue = UInt8.max // maxValue is equal to 255, and is of type UInt8
Int類型
一般來說,編程人員在寫代碼時不需要選擇整數的位數,Swift提供了一種額外的整數類型Int,是和當前機器環境的字長相同的整數位數
在32位機器上,Int和Int32一樣大小
在64位機器上,Int和Int64一樣大小
除非你確實需要使用特定字長的正數,盡量使用Int類型。這保證了代碼的可移植性。即使在32位的平臺上,Int也可以存儲-2,147,483,648 到2,147,483,647范圍內的值,這對大部分正數來講已經足夠了。
UInt類型
Swift還提供了一種無符號類型UInt,同理也是和當前機器環境的字長相等。
在32位機器上,UInt和UInt32一樣大小
在64位機器上,UInt和UInt64一樣大小
注:只有顯式的需要指定一個長度跟機器字長相等的無符號數的時候才需要使用UInt,其他的情況,盡量使用Int,即使這個變量確定是無符號的。都使用Int保證了代碼的可移植性,避免了不同數字類型之間的轉換。詳見.
5、浮點數
浮點數就是像3.14159,0.1,-273.15這樣帶分數的數字。分為Double和Float兩種,其中Double的精度更高。
6、類型安全和類型推導
Swift是一種類型安全的語言。類型安全就是說在編程的時候需要弄清楚變量的類型。如果您的代碼部分需要一個字符串,你不能錯誤地傳遞一個整數類型。
因為Swift是類型安全的,它會執行編譯你的代碼和標志,任何類型不匹配時都會報錯。這使得編程人員能夠盡快捕獲并盡可能早地在開發過程中修正錯誤。
類型檢查可以在使用不同類型的值時幫助避免錯誤。但是,這并不意味著你必須指定每一個常量和變量所聲明的類型。如果不指定你需要的類型,Swift使用類型推導來指定出相應的類型。類型推斷使編譯器自動推斷出特定的表達式的類型時,然后編譯你的代碼,只需通過檢查您提供的值。
因為類型推斷,Swift比起C或Objective-C,不需要過多的類型聲明語句。常量和變量仍然顯式類型,但大部分指定其類型的工作是Swift為你做的。
當你聲明一個常量或變量的初始值類型,類型推斷已經起了作用。這通常是通過賦予文本值(或文字)到所聲明的常量或變量完成。 (字面上的值是直接出現在源代碼中的值,如下面的例子42和3.14159 。 )
例如,如果您指定42到一個新的常數變量,不用說它是什么類型,Swift推斷出你想要的常量是一個整數,因為你已經初始化它為一個整數
let meaningOfLife= 42 // meaningOfLife is inferred to be of typeInt
同樣,如果你不指定浮點值的類型,Swift推斷出你想要創建一個Double:
let pi = 3.14159 // pi is inferred to be of type Double
Swift總是選擇Double(而非Float)當它需要浮點數類型時。
如果你在一個表達式中把整數和浮點數相加,會產生一個Double類型:
let anotherPi= 3 + 0.14159 // anotherPi is also inferred to be of typeDouble
7、數值量表達
整型常量可以寫成:
一個十進制數,不帶前綴
一個二進制數,用前綴0b
一個八進制數,用0o前綴
一個十六進制數,以0x前綴
用這些整型常量來表達十進制值的17:
let decimalInteger= 17 let binaryInteger = 0b10001 // 17 in binary notation let octalInteger = 0o21 // 17 in octal notation let hexadecimalInteger = 0x11 // 17 inhexadecimal notation
浮點文本可以是十進制(不帶前綴)或十六進制(以0x前綴)。它們必須始終具有在小數點的兩側(或十六進制數)。他們也可以有一個可選的指數,由一個大寫或小寫e表示十進制浮點數表示,或大寫或小寫p表示十六進制浮點數
為十進制數用的exp指數,基數乘以10exp:
1.25e2表示1.25×102,或者125.0.
1.25e-2表示1.25×10-2,或者0.0125.
為十六進制數與EXP的指數,基部數乘以2EXP:
0xFp2表示15×22,或者60.0.
0xFp-2表示15×2-2,或者3.75.
所有這些浮點常量來表示十進制的12.1875:
let decimalDouble= 12.1875 let exponentDouble= 1.21875e1 let hexadecimalDouble= 0xC.3p0
數字文本可以包含額外的格式,使它們更容易閱讀。這兩個整數和浮點數可以被額外的零填充,并且可以包含下劃線,以幫助可讀性。無論類型的格式不影響變量的值:
let paddedDouble= 000123.456 let oneMillion= 1_000_000 let justOverOneMillion= 1_000_000.000_000_1
8、數據類型轉換
使用Int類型的代碼中的所有通用的整型常量和變量,即使它們是非負的。在日常生活中使用默認的整數類型是指整型常量和變量是在代碼中直接互操作,并將匹配的類型推斷為整數值。
整數轉換
可以存儲在一個整數常量或變量的范圍根據每個數值類型是不同的。一個Int8常量或變量可以存儲數-128到127之間的數,而一個UInt8常量或變量可以存儲0到255之間的數字。錯誤的賦值會讓編譯器報錯:
let cannotBeNegative: UInt8 = -1 // UInt8 cannot store negative numbers, and so this will report an error let tooBig: Int8 = Int8.max + 1 // Int8 cannot store a number larger thanits maximum value, // and so this will also report an error
因為每個數字類型可以存儲不同范圍的值,你必須選擇加入在逐案基礎上數值類型的轉換。這種選擇適用的做法可以防止隱藏的轉換錯誤,并幫助作出明確在你的代碼的類型轉換意圖。
要轉換一個特定的數字類型到另一個,你初始化與現有值所需類型的新號碼。在下面的例子中,恒定twoThousand是類型UInt16的的,而常數1是類型UINT8的。它們不能被一起直接加入的,因為它們是相同類型的不。相反,該??示例調用UInt16的(一個)來創建一個變量的值初始化的新UInt16的,并且使用這個值來代替原來的:
let twoThousand: UInt16 = 2_000 let one: UInt8 = 1 let twoThousandAndOne= twoThousand + UInt16(one)
由于增加了雙方都類型UInt16的目前,除了是允許的。輸出常數(twoThousandAndOne)推斷為類型UInt16的,因為它是兩個UInt16的值的總和。
個SomeType(ofInitialValue)是默認的方式來調用雨燕類型的初始化,并傳遞一個初始值。在幕后,UInt16的有一個接受UINT8值的初始值設定項,因此這個初始化用于從現有UINT8作出新的UInt16的。你不能傳遞任何類型的這里,但是,它必須是一個類型的UInt16的提供了一個初始化。擴展現有類型,規定接受新的類型(包括你自己的類型定義)是覆蓋在擴展初始化。
整數和浮點數轉換
let three = 3 let pointOneFourOneFiveNine= 0.14159 let pi = Double(three) +pointOneFourOneFiveNine // pi equals 3.14159, and is inferred to beof typde Double
這里,常數3的值被用來創建Double類型的新值,從而使除了兩側是相同類型的。如果沒有這個轉換到位,另外也不會被允許。
反過來也是如此浮點到整數的轉換,在一個整數類型可以用double或float值進行初始化:
let integerPi= Int(pi) // integerPi equals 3, and is inferred tobe of type Int
當用于以這種方式初始化一個新的整數值的浮點值總是被截斷。這意味著,4.75變為4,和-3.9變為-3。
9、類型別名
類型別名為現有類型定義的替代名稱。您可以使用typealias關鍵字定義類型別名。當你使用的類型名稱更符合上下文時,可以定義如:
typealias AudioSample = UInt16
一旦你定義了一個類型別名,你可以在任何會使用原來的名稱地方使用別名:
var maxAmplitudeFound= AudioSample.min // maxAmplitudeFound is now 0
這里,AudioSample被定義為一個UInt16的別名。因為它是一個別名,調用AudioSample.min實際上是調用UInt16.min,給maxAmplitudeFound變量賦初始值0。
10、布爾類型
Swift中的布爾類型使用Bool定義,值分別是true和false:
let orangesAreOrange = true let turnipsAreDelicious = false
跟Int和Double類型一樣,在定義布爾類型的時候不需要顯式的給出數據類型,只需要直接賦值為true或false即可
。布爾類型在條件語句中特別適用,比如在if語句中
if turnipsAreDelicious { println("Mmm, tasty turnips!") } else { println("Eww, turnips are horrible.") } // prints "Eww, turnips are horrible."
像if語句這樣的條件語句,我們會在之后的章節有詳細介紹。
Swift的類型安全策略會防止其他非布爾類型轉換為布爾類型使用,比如
let i = 1 if i { // this example will not compile, and will report an error
就會報錯,但這在其他編程語言中是可行的。
但是如下的定義是正確的:
let i = 1 if i == 1 { // this example will compile successfully }
i == 1的結果就是一個布爾類型,所以可以在這里使用。上面的例子也是一個Swift類型安全的例子。
11、元組類型
元組類型可以將一些不同的數據類型組裝成一個元素,這個元素可以用來作為函數的返回值返回包含多種數據類型
的值。
在下面的例子中,(404, “Not Found”) 是一個HTTP狀態碼,表述的是404錯誤,具體含義是頁面未找到
let http404Error = (404, “Not Found”) // http404Error is of type (Int, String), and equals (404, “Not Found”)
這個元組由一個Int和一個字符串String組成,這樣的組合即包含了數字,也包含了便于人們認知的字符串描述。
編程人員可以隨意地創建自己需要的元組類型,比如 (Int, Int, Int), 或者(String, Bool)等。
可以通過如下方式分別訪問一個元組的值:
let (statusCode, statusMessage) = http404Error println("The status code is \(statusCode)") // prints "The status code is 404" println("The status message is \(statusMessage)") // prints "The status message is Not Found"
如果僅需要元組中的個別值,可以使用(_)來忽略不需要的值
let (justTheStatusCode, _) = http404Error println("The status code is \(justTheStatusCode)") // prints "The status code is 404"
另外,也可以使用元素序號來選擇元組中的值,注意序號是從0開始的
println("The status code is \(http404Error.0)") // prints "The status code is 404" println("The status message is \(http404Error.1)") // prints "The status message is Not Found"
在創建一個元組的時候,也可以直接指定每個元素的名稱,然后直接使用元組名.元素名訪問,如:
let http200Status = (statusCode: 200, description: "OK") println("The status code is \(http200Status.statusCode)") // prints "The status code is 200" println("The status message is \(http200Status.description)") // prints "The status message is OK"
元組類型在作為函數返回值的時候特別適用,可以為函數返回更多的用戶需要的信息。
12、可選類型
在一個值可能不存在的時候,可以使用可選類型。這種類型的定義是:要么存在這個值,且等于x,要么在這個值
不存在。
這種類型在C和Objective-C中是不存在的,但是Objective-C中有一個相似的類型,叫nil,但是僅僅對對象有用。
下面給出一個例子,在Swift中String類型有一個叫toInt的方法,能夠將一個字符串轉換為一個Int類型。但是需
要注意的是,不是所有的字符串都可以轉換為證書。比如字符串”123″可以轉換為123,但是”hello, world”就不能
被轉換。
let possibleNumber = "123" let convertedNumber = possibleNumber.toInt() // convertedNumber is inferred to be of type "Int?", or "optional Int"
由于toInt方法可能會失敗,因此它會返回一個可選的Int類型,而不同于Int類型。一個可選的Int類型被記為Int?
,不是Int。問號表明它的值是可選的,可能返回的是一個Int,或者返回的值不存在。
if語句和強制使用
編程人員可以使用if語句來檢測一個可選類型時候包含一個特定的值,如果一個可選類型確實包含一個值,在if語
句中它將返回true,否則返回false。如果你已經檢測確認該值存在,那么可以使用或者輸出它,在輸出的時候只
需要在名稱后面加上感嘆號(!)即可,意思是告訴編譯器:我已經檢測好這個值了,可以使用它了。如:
if convertedNumber { println("\(possibleNumber) has an integer value of \(convertedNumber!)") } else { println("\(possibleNumber) could not be converted to an integer") } // prints "123 has an integer value of 123"
選擇性綁定
使用一個變量或常量來綁定一個可選類型,在if和while語句中,來檢查該值是否存在,然后再繼續使用它,綁定
方法如下:
if let constantName = someOptional { statements }
那么上一個例子也可以改寫為:
if let actualNumber = possibleNumber.toInt() { println("\(possibleNumber) has an integer value of \(actualNumber)") } else { println("\(possibleNumber) could not be converted to an integer") } // prints "123 has an integer value of 123"
上述代碼理解起來不難:如果這個可選Int類型包含一個值,那么定義一個常量actualNumber來等于這個值,并在
后續代碼中直接使用。
nil
可以給可選類型指定一個特殊的值nil:
var serverResponseCode: Int? = 404 // serverResponseCode contains an actual Int value of 404 serverResponseCode = nil // serverResponseCode now contains no value
如果你定義了一個可選類型并且沒有給予初始值的時候,會默認設置為nil
var surveyAnswer: String? // surveyAnswer is automatically set to nil
注: Swift 的nil不同于Object-C中的nil. Object-C中,nil是一個指針指向不存在的對象。Swift中,nil不是指針而是一個特定類型的空值。任何類型的可選變量都可以被設為nil,不光是指針。
隱式強制使用可選類型
在上面的例子中,可選類型表示一個常量/變量可以沒有值。可選類型可以被if語句檢測是否有值,并且可以被可選綁定解包。
但是在一些情況下,可選類型是一直有效的,那么可以通過定義來隱式地去掉類型檢查,強制使用可選類型。這些可選類型被成為隱式解包的可選類型。你可以直接在類型后面加! 而不是?來指定。
隱式解包的可選類型主要用在一個變量/常量在定義瞬間完成之后值一定會存在的情況。這主要用在類的初始化過程中,詳見Unowned References and Implicitly Unwrapped Optional Properties.
隱式解包的可選類型本質是可選類型,但是可以被當成一般類型來使用,不需要每次驗證值是否存在。如下的例子展示了可選類型和解包可選類型之間的區別。
let possibleString: String? = "An optional string." println(possibleString!) // requires an exclamation mark to access its value // prints "An optional string." let assumedString: String! = "An implicitly unwrapped optional string." println(assumedString) // no exclamation mark is needed to access its value // prints "An implicitly unwrapped optional string."
直接在變量后面加上!,String!,這樣可以確保該值一定存在。
隱式轉換同樣也可以使用if語句來檢測
if assumedString { println(assumedString) } // prints "An implicitly unwrapped optional string."
或者選擇性綁定
if let definiteString = assumedString { println(definiteString) } // prints "An implicitly unwrapped optional string."
13、使用斷言
可選類型讓編程人員可以檢測一個值是否存在,然后使用代碼來處理不存在的情況。但是有些情況下,如果一個值
不存在會直接影響代碼的執行,這個時候就需要使用斷言。只有在滿足特定條件的時候,代碼才會繼續執行。
使用斷言調試
斷言是一種實時檢測條件是否為true的方法。如果這個條件為false,那么代碼將會中斷執行。
在Xcode中,在調試的時候如果中斷,可以通過查看調試語句來找出問題所在。
使用全局函數assert來使用斷言調試,如:
let age = -3 assert(age >= 0, "A person's age cannot be less than zero") // this causes the assertion to trigger, because age is not >= 0
當前一個條件返回false的時候,后面的錯誤日志將會輸出。
在這個例子中,只有當age >= 0的時候,條件被判定為true,但是age = -3,所以條件判定為false,輸出錯誤日志
“A person’s age cannot be less than zero”。
當然錯誤日志也可以省略,但是這樣不利于調試,如
assert(age >= 0)
使用斷言的時間
當需要檢測一個條件可能是false,但是代碼運行必須返回true的時候使用。下面給出了一些常用場景,可能會用
到斷言檢測:
傳遞一個整數類型下標的時候,比如作為數組的Index,這個值可能太小或者太大,從而造成數組越界;
傳遞給函數的參數,但是一個無效的參數將不能在該函數中執行
一個可選類型現在是nil,但是在接下來的代碼中,需要是非nil的值才能夠繼續運行。
本文資源來自互聯網,由本網整理編輯,供大家學習參考。因為技術有限,可能會有不足及錯誤,請大家指正。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn