2017-04-20 47 views
-2

這是我的代碼:swift3如何刪除可選

func uplouadPost() { 

    // shortcut to data to be php 

    let parseJSON = UserDefaults.standard.value(forKey: "parseJSON") as? 
    NSDictionary 
    let userID = parseJSON!["userID"] as! String 

....

if error == nil { 

      do { 

       // json containes $returnArray from php 
       let json = try JSONSerialization.jsonObject(with: data!, 
    options: .mutableContainers) as? NSDictionary 

       print("========================\(userID)")  

打印我得到================ ========可選(23)

但我不想Optioanl

如何只得到23

更重要的是,我試圖用這種方式解開「userID」。但是它不工作

let unwrappedUserID = [userID] 

print (unwrappedUserID) 

謝謝你們

+1

您的「解包」代碼不正確。 – JAL

回答

-2

試試這個,let unwrappedUserID = userID!

+2

這是不好的做法,隱式打開可選項沒有做'零'值或錯誤檢查 –

+0

爲真。我只顯示OP的解包可選的格式。 'nil'和錯誤檢查在他的編碼實踐上。 –

0

檢查和展開Optionals的最好的方法是使用一個guard陳述或if-let語句。

因此,假設你有一個字典定義爲:

let parseJson: [String: Any]? = ["userId": 23] 

即使它的值,它仍然是一個Optional類型,從而訪問我們想要的字典中的值,我們需要檢查的它具有nil價值的可能性,假設我們沒有創建它並且知道它具有實際價值。

使用if-let發言中,我們可以這樣做:

if let json = parseJson { 
    // WILL ONLY EXECUTE IF parseJson IS NOT nil 
    // json is now of type [String: Any] instead of [String: Any]? 
    let userId = json["userId"] 
    print("=========\(userId)") // =========23 
} 

這將創建一個新的範圍在不斷json現在包含非零和parseJson展開可選值。在這種情況下,如果parseJson確實等於nil,那麼將不執行if-let塊內部的代碼。

另一種選擇是guard聲明,它非常相似。

guard let json = parseJson else { 
    // ONLY EXECUTES IF parseJson IS nil 
    // MUST EXIT CURRENT SCOPE AS A RESULT 
    return // or throw NSError() 
} 

let userId = json["userId"] 
print("==========\(userId)") // ==========23 

在這種情況下,代碼後如果parseJson是非零的guard將只執行因爲guard必須出口的範圍的內部。