簡體   English   中英

在Swift中,如果optional是nil,則初始化非可選var的最佳方法

[英]Best way to initialize non-optional var if optional is nil in Swift

我想從UserDefaults獲取變量obj ,它返回一個String? ,如果它是nil構建值並分配它。

以下代碼有效,但最后,我的obj是一個String? 雖然我希望它是一個String (因為它在這個階段不能nil )。

var obj = UserDefaults.standard.string(forKey: "my_key")// Here, obj is a String?
if obj == nil {
    obj =  ProcessInfo.processInfo.globallyUniqueString// Returns, a String
    defaults.set(obj, forKey: "my_key")
    defaults.synchronize()
}
// Here, obj is still a String?

對於這種情況,是否有良好的模式/最佳實踐?

你可以使用nil-coalescing運算符?? “立即評估關閉”:

let obj = UserDefaults.standard.string(forKey: "my_key") ?? {
    let obj = ProcessInfo.processInfo.globallyUniqueString
    UserDefaults.standard.set(obj, forKey: "my_key")
    return obj
}()

print(obj) // Type is `String`

如果未設置用戶缺省值,則執行閉包。 閉包創建並設置用戶默認值(使用本地 obj變量)並將其返回給調用者,以便將其分配給外部obj變量。

可選綁定。 你可以在這里閱讀

let obj: String

if let string = UserDefaults.standard.string(forKey: "my_key") {
    obj = string
} else {
    obj = ProcessInfo.processInfo.globallyUniqueString
    UserDefaults.standard.set(obj, forKey: "my_key")
}

print(obj)

使用guard let或者if let

1) guard let (雖然你的情況不常見)

guard let obj = UserDefaults.standard.string(forKey: "my_key") else { 
    // guard failed - obj is nil; perform something and return
    obj =  ProcessInfo.processInfo.globallyUniqueString
    defaults.set(obj, forKey: "my_key")
    return 
}

// obj is not nil, you have it at your disposal
print(obj)

2) if let

if let obj = UserDefaults.standard.string(forKey: "my_key") {
   // obj exists
} else {
    let obj =  ProcessInfo.processInfo.globallyUniqueString
    defaults.set(obj, forKey: "my_key")
    print(obj)
} 

(!)此外,確實不再需要調用defaults.synchronize()

等待默認數據庫的任何掛起的異步更新並返回; 此方法是不必要的,不應使用。

https://developer.apple.com/documentation/foundation/nsuserdefaults/1414005-synchronize

您還可以使用隱式解包的可選項,如下所示:

var obj: String! = UserDefaults.standard.string(forKey: "my_key")// Here, obj is a (possibly `nil`) `String!`
if obj == nil {
    obj =  ProcessInfo.processInfo.globallyUniqueString // Returns, a String
    defaults.set(obj, forKey: "my_key")
    defaults.synchronize()
}

// Here, obj is a non-`nil` `String!`, which will work the same as a `String`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM