模式:当可选为 nil 时使用默认值
Pattern: Using a default value when optional is nil
我正在寻找一种可靠的、可重复的模式来填充可选值。我想要的行为是 "if it's nil, use this default".
到目前为止,我有三种处理方法。
// Three approaches for using a default value when the optional is nil
// Device.location is an optional `CLLocation?`
// cfg.defaultLocation is `CLLocation`
// 1: bitwise (nice and short, requires a holding variable)
let location1: CLLocation! = Device.location ?? cfg.defaultLocation
positionMap(location1)
// 2: if let (sooooo many lines!)
if let location2 = Device.location {
positionMap(location2)
} else {
positionMap(cfg.defaultLocation)
}
// 3: re-wrap (holding var :( )
let location3: CLLocation! = Device.location
positionMap(location3 ?? cfg.defaultLocation)
你们有更好的方法吗?对我来说很多。
我的方法是使用计算属性。使用这些的最大缺点是您总是计算 属性 值,这当然会占用一些处理资源。但另一方面,最大的优点是,如果在应用程序生命周期的某个时候可选值发生变化,那么您不必手动更改非可选变量(保留默认值)。
let location : CLLocation {
return Device.location ?? cfg.defaultLocation
}
我正在寻找一种可靠的、可重复的模式来填充可选值。我想要的行为是 "if it's nil, use this default".
到目前为止,我有三种处理方法。
// Three approaches for using a default value when the optional is nil
// Device.location is an optional `CLLocation?`
// cfg.defaultLocation is `CLLocation`
// 1: bitwise (nice and short, requires a holding variable)
let location1: CLLocation! = Device.location ?? cfg.defaultLocation
positionMap(location1)
// 2: if let (sooooo many lines!)
if let location2 = Device.location {
positionMap(location2)
} else {
positionMap(cfg.defaultLocation)
}
// 3: re-wrap (holding var :( )
let location3: CLLocation! = Device.location
positionMap(location3 ?? cfg.defaultLocation)
你们有更好的方法吗?对我来说很多。
我的方法是使用计算属性。使用这些的最大缺点是您总是计算 属性 值,这当然会占用一些处理资源。但另一方面,最大的优点是,如果在应用程序生命周期的某个时候可选值发生变化,那么您不必手动更改非可选变量(保留默认值)。
let location : CLLocation {
return Device.location ?? cfg.defaultLocation
}