<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Swift 可選項 > 原文: [https://www.programiz.com/swift-programming/optionals](https://www.programiz.com/swift-programming/optionals) #### 在本文中,您將學習可選項,其用例以及 Swift 中的可選項處理。 在上一篇文章中,我們了解了 Swift 中可用的不同數據類型,并且還注意到這些類型聲明的變量或常量包含默認值。 **示例**: ```swift let someValue = Int() print(someValue) ``` 運行該程序時,輸出為: ```swift 0 ``` 但是,Swift 中還有另一種稱為`Optional`的數據類型,其默認值為空值(`nil`)。 如果希望變量或常量中不包含任何值,則可以使用可選項。 可選項可以包含一個值或不存在一個值(空值)。 從技術上講,您可以認為它是可選的鞋盒。 鞋盒中可能裝有鞋,也可能沒有。 因此,從包裝箱中取出鞋子時,您應該事先知道。 * * * ## 如何聲明`Optional`? 通過將`!`或`?`附加到`Type`,您可以簡單地將數據類型表示為`Optional`。 如果一個可選參數中包含一個值,則返回值為`Optional<Value>`,否則返回`nil`。 ### 示例 1:如何在 Swift 中聲明一個可選項? ```swift var someValue:Int? var someAnotherValue:Int! print(someValue) print(someAnotherValue) ``` 運行該程序時,輸出為: ```swift nil nil ``` 在上面的程序中,我們使用`?`和`!`初始化了一個可選項。 兩種方法都是可以創建可選項的方法,但是有一個主要的不同,我們將在下面進行探討。 聲明一個可選的`Int`意味著該變量將具有整數值或無值。 由于沒有為變量分配任何值,因此您可以在屏幕上看到兩個`print`語句輸出`nil`。 * * * ### 示例 2:從可選項分配和訪問值 ```swift let someValue:Int? = 5 print(someValue) print(someValue!) ``` 運行該程序時,輸出為: ```swift Optional(5) 5 ``` 在上面的程序中,我們聲明了`Int`類型的可選項,并在其中分配了值 5。 如您所見,將可選項打印為`print(someValue)`不會給您`5`而是`Optional(5)`。 它具有上述形式:`Optional<Value>`。 為了從中訪問`<Value>`,我們需要一種稱為**展開**的機制。 您可以通過在變量/常量的末尾附加`!`字符來展開可選字符,如下一行`print(someValue!)`所示。`print(someValue!)`打開包裝,并在屏幕上輸出`5`。 但是,請記住,僅當確定在訪問可選項時肯定具有值時,才應使用這種解包機制。 * * * ### 示例 3:顯式聲明一個未包裝的可選項 您還可以通過以下方式創建解包后的可選項: ```swift let someValue:Int! = 5 print(someValue) ``` 運行該程序時,輸出為: ```swift 5 ``` 在上面的程序中,`Int!`創建一個未包裝的可選項,當您訪問它時,它會自動對值進行包裝,因此您不必每次都附加`!`字符。 請確保在使用這些可選項時,變量在訪問它時始終需要有一個值。 如果不這樣做,將會導致致命的錯誤崩潰。 * * * ### 示例 4:訪問`null`的未包裝可選對象時發生致命錯誤 ```swift var someValue:Int! var unwrappedValue:Int = someValue //crashes due to this line ``` 當您運行該程序時,您會因**致命錯誤**而崩潰:在解開可選項時意外發現`nil`,因為代碼`unwrappedValue:Int = someValue`試圖將可選`someValue`中的值賦給變量`unwrappedValue`。 但是,`somevalue`是包含`nil`值的`Optional`類型。 嘗試將`nil`值分配給變量`unwrappedValue`(這不是可選的)會導致崩潰。 有多種處理此情況的技術,下面將進行說明。 * * * ## 可選項處理 為了使用可選項,需要將其解包。 使用可選項的更好方法是通過條件展開而不是使用`!`運算符強制展開。 這是因為有條件的展開詢問**檢查此變量是否具有值?**。 如果是,請提供該值,否則將處理`nil`情況。 相反,強制展開表示**該變量在使用時確實有一個值**。 因此,當您強制解開一個`nil`的變量時,您的程序將在解開可選異常并拋出的同時拋出**意外發現的`nil`**。 下面說明了一些用于條件展開的技術: ### 1\. `If`語句 您可以使用`if`語句,然后將可選參數與`nil`進行比較,以找出可選參數是否包含值。 您可以在`if`語句中使用比較運算符“等于”運算符(`==`)或“不等于”運算符(`!=`)。 #### 示例 5:`if else`語句的可選項處理 ```swift var someValue:Int? var someAnotherValue:Int! = 0 if someValue != nil { print("It has some value \(someValue!)") } else { print("doesn't contain value") } if someAnotherValue != nil { print("It has some value \(someAnotherValue!)") } else { print("doesn't contain value") } ``` 運行該程序時,輸出為: ```swift doesn't contain value It has some value 0 ``` 在上面的程序中,如果可選項包含值,則執行`if`語句內的代碼,否則執行`else`塊內的語句。 使用此技術進行可選項處理的主要缺點是,您仍然需要使用`!`運算符從可選項中解包該值。 * * * ### 2.可選綁定(如果允許) 可選綁定可幫助您找出可選項是否包含值。 如果可選項包含一個值,則該值可用作臨時常量或變量。 因此,可以將可選綁定與`if`語句一起使用,以檢查可選項內部的值,并在單個操作中將該值提取到常量或變量中。 #### 示例 5:使用`if let`語句的可選項處理 ```swift var someValue:Int? var someAnotherValue:Int! = 0 if let temp = someValue { print("It has some value \(temp)") } else { print("doesn't contain value") } if let temp = someAnotherValue { print("It has some value \(temp)") } else { print("doesn't contain value") } ``` 運行該程序時,輸出為: ```swift doesn't contain value It has some value 0 ``` 在上面的程序中,如果可選項包含一個值,則執行`if`語句中的代碼。 否則,`else`塊將被執行。`if-let`語句還自動展開該值,并將展開后的值放入`temp`常量中。 該技術的主要優勢在于,盡管可以確定某個可選項包含一個值,但您無需強行解開該值。 * * * ### 3.`guard`語句 您可以使用`guard`處理 Swift 中的可選項。 如果您不知道什么警衛,請不要擔心。 現在,僅將警衛視為沒有`if`塊的`if-else`條件。 如果條件失敗,則執行`else`語句。 如果不是,則執行下一條語句。 有關更多詳細信息,請參見 [Swift `Guard`](/swift-programming/guard-statement "Swift guard statement")。 #### 示例 6:使用`guard`的可選項處理 ```swift func testFunction() { let someValue:Int? = 5 guard let temp = someValue else { return } print("It has some value \(temp)") } testFunction() ``` 運行該程序時,輸出為: ```swift It has some value 5 ``` 在上述程序中,防護包含一個條件,即可選的`someValue`是否包含值。 如果它包含一個值,則`guard-let`語句將自動解包該值,并將解包后的值放入`temp`常量中。 否則,`else`塊將被執行,它將返回到調用函數。 由于可選項包含一個值,因此將調用`print`函數。 * * * ### 4.`nil`折疊運算符 在 Swift 中,您還可以使用`nil`折疊運算符檢查可選變量是否包含值。 定義為`(a ?? b)`。 它解開可選的`a`并返回它(如果它包含一個值),或者如果`a`為零,則返回默認值`b`。 #### 示例 7:使用`nil`折疊運算符的可選項處理 ```swift var someValue:Int! let defaultValue = 5 let unwrappedValue:Int = someValue ?? defaultValue print(unwrappedValue) ``` 運行該程序時,輸出為: ```swift 5 ``` 在上面的程序中,變量`someValue`定義為項,并且包含`nil`值。 `nil`合并運算符無法解開可選項,因此返回`defaultValue`。 因此,語句`print(unwrappedValue)`在控制臺中輸出 5。 ```swift var someValue:Int? = 10 let defaultValue = 5 let unwrappedValue:Int = someValue ?? defaultValue print(unwrappedValue) ``` 運行該程序時,輸出為: ```swift 10 ``` 但是,在上述程序中,可選變量`someValue`初始化為值 10。因此,nil 合并運算符成功地從`someValue`中解包了該值。 因此,語句`someValue ?? defaultValue`返回 10,并且語句`print(unwrappedValue)`在控制臺中輸出 10。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看