Swift教程之基本數據類型詳解。本站提示廣大學習愛好者:(Swift教程之基本數據類型詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift教程之基本數據類型詳解正文
基本類型
固然Swift是一個為開辟iOS和OS X app設計的全新編程說話,然則Swift的許多特征照樣跟C和Objective-C類似。
Swift也供給了與C和Objective-C相似的基本數據類型,包含整形Int、浮點數Double和Float、布爾類型Bool和字符串類型String。Swift還供給了兩種更壯大的根本聚集數據類型,Array和Dictionary,更具體的內容可以參考:Collection Types。
跟C說話一樣,Swift應用特定的稱號來界說和應用變量。異樣,Swift中也能夠界說常量,與C說話分歧的是,Swift中的常量加倍壯大,在編程時應用常量可以或許讓代碼看起來加倍平安和簡練。
除罕見的數據類型以外,Swift還集成了Objective-C中所沒有的“元組”類型,可以作為一個全體被傳遞。元組也能夠成為一個函數的前往值,從而許可函數一次前往多個值。
Swift還供給了可選類型,用來處置一些未知的不存在的值。可選類型的意思是:這個值要末存在,而且等於x,要末基本不存在。可選類型相似於Objective-C中指針的nil值,然則nil只對類(class)有效,而可選類型對一切的類型都可用,而且更平安。可選類型是年夜部門Swift新特征的焦點。
可選性類型只是Swift作為類型平安的編程說話的一個例子。Swift可以贊助你更快地發明編碼中的類型毛病。假如你的代碼希冀傳遞的參數類型是String的,那末類型平安就會避免你毛病地傳遞一個Int值。如許便可以讓編程人員在開辟期更快地發明和修復成績。
常量和變量
常量和變量由一個特命名稱來表現,如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簡直都可以隱式切實其實定變量或常量的類型,詳見: Type Safety and Type Inference。而下面的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!”
注:關於格局化字符的詳見 String Interpolation
正文
不介入編譯的語句稱為正文,正文可以提醒你代碼的意圖。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 */
如許可以便利地在年夜段已正文的代碼塊中持續添加正文
分號
和其它一些編程說話分歧,Swift不須要應用分號 ; 來分隔每個語句。固然你也能夠選擇應用分號,或許你想在一行中書寫多個語句。
let cat = ""; println(cat)
// prints ""
整數
整數就是像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
這些值界限值辨別了整數的類型(好比UInt8),所以可以像該類型的其他值一樣被用在表達式中而不消斟酌好處的成績。
Int類型
普通來講,編程人員在寫代碼時不須要選擇整數的位數,Swift供給了一種額定的整數類型Int,是和以後機械情況的字長雷同的整數位數
1.在32位機械上,Int和Int32一樣年夜小
2.在64位機械上,Int和Int64一樣年夜小
除非你確切須要應用特定字長的負數,盡可能應用Int類型。這包管了代碼的可移植性。即便在32位的平台上,Int也能夠存儲-2,147,483,648 到2,147,483,647規模內的值,這對年夜部門負數來說曾經足夠了。
UInt類型
Swift還供給了一種無符號類型UInt,同理也是和以後機械情況的字長相等。
1.在32位機械上,UInt和UInt32一樣年夜小
2.在64位機械上,UInt和UInt64一樣年夜小
注:只要顯式的須要指定一個長度跟機械字長相等的無符號數的時刻才須要應用UInt,其他的情形,盡可能應用Int,即便這個變量肯定是無符號的。都應用Int包管了代碼的可移植性,防止了分歧數字類型之間的轉換。詳見Type Safety and Type Inference.
5、浮點數
浮點數就是像3.14159,0.1,-273.15如許帶分數的數字。浮點數可以表達比Int規模更廣(更年夜或更小)的數值。swift支撐兩種帶符號浮點數類型:
1.Double類型能表現64位的有符號浮點數。當須要表的數字異常年夜或許精度請求異常高的時刻可使用Double類型。
2.Float類型能表現32為的有符號浮點數。當須要表達的數字不須要64位精度的時刻可使用Float類型。
注 Double 至多有15位小數,Float至多有6位小數。適合的浮點數小數位數取決於你代碼裡須要處置的浮點數規模。
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
常值3沒有顯示指明類型,所以Swift依據表達式中的浮點值推出輸入類型Double。
數值量表達
整型常量可以寫成:
1.一個十進制數,不帶前綴
2.一個二進制數,用前綴0b
3.一個八進制數,用0o前綴
4.一個十六進制數,以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的十進制數,現實值等於基數乘以10的exp次方,如:
◎1.25e2表現1.25×102,或許125.0.
◎1.25e-2表現1.25×10-2,或許0.0125.
帶指數exp的十六進制數,現實值等於基部數乘以2的exp次方,如:
◎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
數值類型轉換
為代碼中一切通用的數值型整型常量和變量應用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類型的,而常量one是UINT8類型的。它們不克不及被直接相加的,由於類型分歧。相反的,該示例挪用UInt16(one)來創立一個用變量one的值初始化的UInt16類型的新變量,而且應用這個值來取代本來的值介入運算:
let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
let twoThousandAndOne= twoThousand + UInt16(one)
可以因為相加兩邊的類型都是UInt16的,如今可以做加法運算了。輸入常量(twoThousandAndOne)被揣摸為UInt16類型的,由於它是兩個UInt16的值的總和。
SomeType(ofInitialValue)是Swift默許的類型轉換方法。完成上看,UInt16的有一個接收UINT8值的結構器,這個結構器用於從現有UInt8結構出一個新的UInt16的變量。你不克不及傳入隨意率性類型的參數,它必需是一個類型的UInt16初始化能接收的類型。若何擴大現有類型,劃定接收新的類型(包含你本身的類型界說)可以拜見Extensions。
整數和浮點數轉換
整數和浮點類型之間的轉化必需顯式聲明:
let three = 3
let pointOneFourOneFiveNine= 0.14159
let pi = Double(three) +pointOneFourOneFiveNine
// pi equals 3.14159, and is inferred to beof typde Double
這裡,常量three的值被用來創立Double類型的新變量,從而使表達式兩側是雷同的類型。假如沒有這個轉換,加法操作不會被許可。反之亦然,一個整數類型可以用double或float值停止初始化:
let integerPi= Int(pi)
// integerPi equals 3, and is inferred tobe of type Int
當應用這類方法初始化一個新的整數值的時刻,浮點值老是被截斷。這意味著,4.75變成4,和-3.9變成-3。
注:數值類型常量/變量的類型轉換規矩和數字類型常值的轉換規矩分歧。常值3可以直接與常值0.14159相加,由於常值沒有一個明白的類型。他們的類型是被編譯器推導出來的。
類型別號
類型別號為現有類型界說的可替換稱號。你可使用typealias症結字界說類型別號。類型別號可以贊助你應用更相符高低文語境的名字來指代一個已存在的類型,好比處置一個外來的有指定長度的類型的時刻:
typealias AudioSample = UInt16
一旦你界說了一個類型別號,你可以在任何能夠應用本來的稱號處所應用別號:
var maxAmplitudeFound= AudioSample.min
// maxAmplitudeFound is now 0
這裡,AudioSample被界說為一個UInt16的別號。由於它是一個體名,挪用AudioSample.min現實上是挪用UInt16.min,從而給maxAmplitudeFound變量賦初始值0。
布爾類型
Swift中的布爾類型應用Bool界說,也被稱為Logical(邏輯)類型,可選值是true和false:
let orangesAreOrange = true
let turnipsAreDelicious = false
這裡 orangesAreOrange和turnipsAreDelicious的類型被推導為Bool 由於他們被初始化被Bool類型的常值。跟Int和Double類型一樣,在界說布爾類型的時刻不須要顯式的給出數據類型,只須要直接賦值為true或false便可 。當應用肯定類型的常值初始化一個常量/變量的時刻,類型推導使Swift代碼更准確和可讀。 布爾類型在前提語句中特殊實用,好比在if語句中
if turnipsAreDelicious {
println("Mmm, tasty turnips!")
} else {
println("Eww, turnips are horrible.")
}
// prints "Eww, turnips are horrible."
像if語句如許的前提語句,我們會在以後的章節ControlFlow有具體引見。 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的成果就是一個布爾類型,所以可以經由過程類型檢討。像i==1這類比擬將會在章節[Basic Operators]中評論辯論。下面的例子也是一個Swift類型平安的例子。類型平安防止了有時的類型毛病,包管了代碼的意圖是明白的。
元組類型
元組類型可以將一些分歧的數據類型組裝成一個元素,這些數據類型可所以隨意率性類型,而且不須要是異樣的類型。
鄙人面的例子中,(404, “Not Found”) 是一個HTTP狀況碼。HTTP狀況碼是要求網頁的時刻前往的一種特定的狀況編碼。404毛病的詳細寄義是頁面未找到。
let http404Error = (404, “Not Found”) // http404Error is of type (Int, String), and equals (404, “Not Found”)
這個元組由一個Int和一個字符串String構成,如許的組合即包括了數字,也包括了便於人們認知的字符串描寫。這個元組可以描寫為類型(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"
元組類型在作為函數前往值的時刻特殊實用,可認為函數前往更多的用戶須要的信息。好比一個要求web頁面的函數可以前往(Int,String)類型的元組來表征頁面獲得的勝利或許掉敗。前往兩個分歧類型構成的元組可以比只前往一個類型的一個值供給更多的前往信息。詳見Functions with Multiple Return Values
可選類型
在一個值能夠不存在的時刻,可使用可選類型。這類類型的界說是:要末存在這個值,且等於x,要末在這個值 不存在。
注:這類類型在C和Objective-C中是不存在的,然則Objective-C中有一個類似的類型,叫nil,然則僅僅對對象有效。對其他的情形,Object-C辦法前往一個特別值(好比NSNotFound)來注解這個值不存在。這類方法假定辦法挪用者曉得這個特別值的存在和寄義。Swift的可選類型贊助你界說隨意率性的值不存在的情形。
上面給出一個例子,在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語句如許的前提語句,我們會在以後的章節ControlFlow有具體引見。
選擇綁定
選擇綁定贊助肯定一個可選值是否是包括了一個值,假如包括,把該值轉化成一個暫時常量或許變量。選擇綁定可以用在if或while語句中,用來在可選類型內部檢討能否有值並提取能夠的值。if和while語句詳見ControlFlow。
辦法以下:
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"
上述代碼懂得起來不難:假如possibleNumber.toInt 前往的這個可選Int類型包括一個值,那末界說一個常量actualNumber來等於這個值,並在 後續代碼中直接應用。
假如轉換是勝利的,那末actualNumber常量在if的第一個分支可用,而且被初始化為可選類型包括的值,同時也不須要應用!前綴。這個例子裡,actualNumber只是簡略的被用來打印成果。
常量和變量都可以用來做可選綁定。假如你想要在if第一個分支修正actualNumber的值,可以寫成if var actualNumber, 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."
你可以把隱式解包可選類型當做對每次應用的時刻主動解包的可選類型。即不是每次應用的時刻在變量/常量前面加!而是直接在界說的時刻加。
注:假如一個隱式解包的可選類型不包括一個現實值,那末對它的拜訪會拋出一個運轉時毛病。在變量/常量名前面加!的情形也是一樣的。
你仍然可以把解包可選類型當做正常的可選類型來探測能否有值。
if assumedString {
println(assumedString)
}
// prints "An implicitly unwrapped optional string."
或許經由過程選擇綁定檢討
if let definiteString = assumedString {
println(definiteString)
}
// prints "An implicitly unwrapped optional string."
注:假如一個可選類型存在沒有值的能夠的話,不該該應用解包可選類型。這類情形下,必定要應用正常的可選類型。
斷言
可選類型讓編程人員可以在運轉期檢測一個值能否存在,然後應用代碼來處置不存在的情形。然則有些情形下,假如一個值 不存在或許值不知足前提會直接影響代碼的履行,這個時刻就須要應用斷言。這類情形下,斷言停止法式的履行從而供給調試的根據。
應用斷言調試
斷言是一種及時檢測前提能否為true的辦法,也就是說,斷言假定前提為true。斷言包管了後續代碼的履行依附於前提的成立。假如前提知足,那末代碼持續履行,假如這個前提為false,那末代碼將會中止履行。
在Xcode中,在調試的時刻假如中止,可以經由過程檢查調試語句來檢查斷言掉敗時的法式狀況。斷言也能供給合適的debug信息。 應用全局函數assert來應用斷言調試,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的值能力夠持續運轉。
詳見 Subscripts和Functions
注:斷言會招致法式運轉的中斷,所以假如異常是預期能夠產生的,那末斷言是不適合的。這類情形下,異常是更適合的。斷言包管毛病在開辟進程中會被發明,宣布的運用裡最好不要應用。