swift中的聲明?基礎Swift是iOS,macOS,watchOS和tvOS應用程序開發的新編程語言盡管如此,Swift的很多部分都将從您在C和Objective-C中開發的經驗中熟悉起來,我來為大家科普一下關于swift中的聲明?以下内容希望對你有幫助!
基礎
Swift是iOS,macOS,watchOS和tvOS應用程序開發的新編程語言。盡管如此,Swift的很多部分都将從您在C和Objective-C中開發的經驗中熟悉起來。
Swift提供了它自己的所有基本C和Objective-C類型的版本,包括用于整數的Int,用于浮點值的Double和Float,用于布爾值的Bool和用于文本數據的String。 Swift還提供了三種主要集合類型的強大版本,如集合類型中所述的Array,Set和Dictionary。
像C一樣,Swift使用變量來存儲和引用一個識别名稱的值。 Swift也廣泛使用其值不能改變的變量。這些被稱為常量,并且比C中的常量強大得多。當您使用不需要更改的值時,常量在Swift中用于使代碼更安全和更清晰。
除了熟悉的類型之外,Swift還引入了在Objective-C中找不到的高級類型,例如元組。元組使您能夠創建和傳遞值組。您可以使用元組作為單個複合值從函數中返回多個值。
Swift還引入了可選類型,它處理缺少值的情況。可選項:“有價值,它等于x”或“根本沒有價值”。使用optionals類似于在Objective-C中使用零指針,但它們适用于任何類型,而不僅僅是類。 Objective-C中的option指針不僅比零指針更安全,更具表現力,它們是Swift最強大功能中的核心。
if let constantName = someOptional {
statements
}
您可以重寫Optionalals部分中的possibleNumber示例以使用可選綁定而不是強制展開:
if let actualNumber = Int(possibleNumber) {
print("\"\(possibleNumber)\" has an integer value of \(actualNumber)")
} else {
print("\"\(possibleNumber)\" could not be converted to an integer")
}
// Prints ""123" has an integer value of 123"
他的代碼可以被理解為:
“如果由Int(possibleNumber)返回的可選Int包含一個值,則将一個名為actualNumber的新常量設置為包含在可選項中的值。”
如果轉換成功,那麼actualNumber常量可用于if語句的第一個分支内。它已經被初始化為包含在可選項中的值,所以不需要使用!後綴以訪問其值。在本例中,actualNumber僅用于打印轉換結果。
您可以使用可選綁定的常量和變量。如果要在if語句的第一個分支内操作actualNumber的值,則可以編寫if var actualNumber,而将可選内容包含在變量中而不是常量中。
您可以根據需要在單個if語句中包含盡可能多的可選綁定和布爾條件,并用逗号分隔。如果可選綁定中的任何值為零,或者任何布爾條件的計算結果為false,則整個if語句的條件被認為是錯誤的。以下if語句是等價的:
if let firstNumber = Int("4"), let secondNumber = Int("42"), firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
// Prints "4 < 42 < 100"
if let firstNumber = Int("4") {
if let secondNumber = Int("42") {
if firstNumber < secondNumber && secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
}
}
// Prints "4 < 42 < 100"
注意
在if語句中使用可選綁定創建的常量和變量僅在if語句的主體中可用。相反,使用guard語句創建的常量和變量在Guard語句後面的代碼行中可用,如Early Exit中所述。
隐式解包選項
如上所述,可選項表示允許常量或變量具有“無值”。可以使用if語句檢查選項,以查看是否存在值,并且可以使用可選綁定有條件地解包,以訪問可選值(如果存在)。
有時候從程序的結構中可以清楚地看到,在第一次設置值之後,可選項将始終有一個值。在這些情況下,每次訪問時都不必檢查和打開可選的值,因為可以安全地假定所有時間都有值。
這些選項被定義為隐式解包選項。通過在想要進行選擇的類型後放置感歎号(String!)而不是問号(String?),可以編寫一個隐式解包的可選項。
當可選值被确定為在第一次定義可選值後立即存在,并且肯定可以假設其後每一點都存在時,隐式解包的可選值就很有用。 Swift中隐式展開選項的主要用途是在類初始化期間,如Unowned References和Unviousned Unwrapped Optional Properties中所述。
隐式解包可選是幕後的普通可選,但也可以像非可選值一樣使用,而不必在每次訪問時解開可選值。以下示例顯示了在以可顯示的字符串形式訪問其包裝值時,可選字符串與隐式解包的可選字符串之間的行為差異:
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
你可以想象一個隐式解包的可選方案,因為隻要使用它就可以自動解包可選的權限。 每次使用該名稱時,不要在可選名稱後面放置感歎号,而要在聲明它時在可選類型後面放置感歎号。
注意
如果隐式解包的可選項為零,并且您嘗試訪問其包裝的值,則會觸發運行時錯誤。 結果與在不包含值的普通可選項後放置感歎号完全相同。
你仍然可以像一個普通的可選項那樣處理隐式解包的可選項,以檢查它是否包含值:
if assumedString != nil {
print(assumedString!)
}
// Prints "An implicitly unwrapped optional string."
你也可以使用一個帶有可選綁定的隐式解包的可選方法,在一個語句中檢查和打開它的值:
if let definiteString = assumedString {
print(definiteString)
}
// Prints "An implicitly unwrapped optional string."
注意
當稍後有可能變量為零時,不要使用隐式解包的可選項。 如果您需要在變量的生命周期中檢查零值,則始終使用正常的可選類型。
錯誤處理
您可以使用錯誤處理來響應程序在執行過程中可能遇到的錯誤情況。
與可以使用值的存在或不存在來傳遞函數的成功或失敗的可選項相比,錯誤處理允許您确定失敗的根本原因,并在必要時将錯誤傳播到程序的另一部分。
當函數遇到錯誤情況時,它會引發錯誤。 然後該函數的調用者可以捕獲錯誤并做出适當的響應。
func canThrowAnError() throws {
// this function may or may not throw an error
}
函數指示它可以通過在其聲明中包含throws關鍵字來引發錯誤。 當你調用一個可能引發錯誤的函數時,你需要在表達式中加上try關鍵字。
Swift會自動将錯誤傳播出當前範圍,直到它們被catch子句處理。
do {
try canThrowAnError()
// no error was thrown
} catch {
// an error was thrown
}
do語句創建一個新的包含範圍,它允許将錯誤傳播到一個或多個catch子句。
以下是錯誤處理如何用于響應不同錯誤情況的示例:
func makeASandwich() throws {
// ...
}
do {
try makeASandwich()
eatASandwich()
} catch SandwichError.outOfCleanDishes {
washDishes()
} catch SandwichError.missingIngredients(letingredients) {
buyGroceries(ingredients)
}
在這個例子中,如果沒有幹淨的盤子或缺少任何配料,makeASandwich()函數将會報錯。因為makeASandwich()可能會引發錯誤,所以函數調用被包裝在try表達式中。通過将函數調用包裝在do語句中,抛出的任何錯誤都會傳播到提供的catch子句。
如果沒有錯誤發生,則調用eatASandwich()函數。如果抛出一個錯誤并且它與SandwichError.outOfCleanDishes大小寫匹配,那麼将調用washDishes()函數。如果抛出一個錯誤,并且它與SandwichError.missingIngredients案件相匹配,則使用catch模式捕獲的關聯[String]值調用buyGroceries(_ :)函數。
錯誤處理中詳細介紹了投擲,捕捉和傳播錯誤。
斷言和先決條件
斷言和先決條件是在運行時發生的檢查。在執行任何進一步的代碼之前,您可以使用它們來确保滿足基本條件。如果斷言或前提條件中的布爾條件評估為true,則代碼繼續照常執行。如果條件評估為false,則該程序的當前狀态無效;代碼執行結束,并且您的應用程序被終止。
您使用斷言和先決條件來表達您所做的假設和編碼時的期望,以便您可以将它們包含在代碼中。斷言有助于您在開發過程中發現錯誤和不正确的假設,并且先決條件可幫助您檢測生産中的問題。
除了在運行時驗證您的期望之外,斷言和先決條件也成為代碼中有用的文檔形式。與上述錯誤處理中讨論的錯誤條件不同,斷言和先決條件不用于可恢複或預期的錯誤。由于失敗的斷言或先決條件表示無效的程序狀态,因此無法捕獲失敗的斷言。
使用斷言和先決條件不能取代設計代碼的方式,使得不可能出現無效條件。但是,使用它們來強制執行有效的數據和狀态會導緻應用程序在發生無效狀态時更可預測地終止,并且有助于使問題更易于調試。一旦檢測到無效狀态,立即停止執行也有助于限制由該無效狀态引起的損害。
斷言和先決條件之間的區别在于它們被檢查時:斷言僅在調試版本中檢查,但在調試版本和生産版本中都檢查了先決條件。在生産構建中,斷言内的條件不被評估。這意味着您可以在開發過程中使用盡可能多的斷言,而不會影響生産性能。
使用斷言進行調試
你可以通過調用Swift标準庫中的assert(_:_:file:line :)函數來編寫斷言。如果條件的結果為假,則将此函數傳遞給一個表達式,該表達式的值為true或false,并顯示一條消息。例如:
let age = -3
assert(age >= 0, "A person's age can't be less than zero.")
// This assertion fails because -3 is not >= 0.
在這個例子中,如果age> = 0的計算結果為true,那麼代碼将繼續執行,即如果age的值非負。 如果age的值是負數,如上面的代碼所示,那麼age> = 0的計算結果為false,并且斷言失敗,終止應用程序。
你可以省略斷言信息 - 例如,當它隻是重複作為散文的條件。
assert(age >= 0)
如果代碼已經檢查了條件,則使用assertionFailure(_:file:line :)函數來指示斷言失敗。 例如:
if age > 10 {
print("You can ride the roller-coaster or the ferris wheel.")
} else if age > 0 {
print("You can ride the ferris wheel.")
} else {
assertionFailure("A person's age can't be less than zero.")
}
執行先決條件
隻要條件有可能為假,就要使用前提條件,但必須對代碼繼續執行而言必須如此。 例如,使用前提條件檢查下标是否超出界限,或者檢查函數是否已傳遞有效值。
您通過調用前提條件precondition(_:_:file:line:)函數來編寫前提條件。 如果條件的結果為假,則将此函數傳遞給一個表達式,該表達式的值為true或false,并顯示一條消息。 例如:
// In the implementation of a subscript...
precondition(index > 0, "Index must be greater than zero.")
您也可以調用preconditionFailure(_:file:line :)函數來指示發生了故障 - 例如,如果采取了開關的默認情況,但所有有效的輸入數據都應由交換機的其中一個處理 其他情況。
注意
如果以非檢查模式編譯(-Ounchecked),則不會檢查前提條件。 編譯器假定前提條件始終為真,并相應地優化您的代碼。 但是,無論優化設置如何,fatalError(_:file:line :)函數總是會暫停執行。
通過将fatalError(“Unimplemented”)作為存根實現,您可以在原型設計和早期開發中使用fatalError(_:file:line :)函數為尚未實現的功能創建存根。 由于緻命錯誤永遠不會被優化,與斷言或前提條件不同,您可以确保執行始終在遇到存根實現時暫停。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!