扩展默认值的swift选项
我试图用默认值扩展Swift的扩展默认值的swift选项,swift,Swift,我试图用默认值扩展Swift的可选的类型。在API请求中提供空值会引发异常。我已经对字符串类型执行了此操作,但是对于整数类型,我无法实现相同的结果: extension Optional where Wrapped == String { var unwrappedValue: String { get { switch self { case .some(let value): ret
可选的类型。在API请求中提供空值会引发异常。我已经对字符串
类型执行了此操作,但是对于整数
类型,我无法实现相同的结果:
extension Optional where Wrapped == String {
var unwrappedValue: String {
get {
switch self {
case .some(let value):
return value
case .none:
return ""
}
}
}
}
整数
版本抛出以下错误
:
协议“Integer”只能用作一般约束,因为它
具有自身或关联的类型要求
您只需要返回Wrapped而不是Integer
extension Optional where Wrapped: Integer {
var unwrappedValue: Wrapped {
switch self {
case .some(let value):
return value
case .none:
return 0
}
}
}
或者干脆
extension Optional where Wrapped: Integer {
var safelyUnwrapped: Wrapped { return self ?? 0 }
}
您只需要返回Wrapped而不是Integer
extension Optional where Wrapped: Integer {
var unwrappedValue: Wrapped {
switch self {
case .some(let value):
return value
case .none:
return 0
}
}
}
或者干脆
extension Optional where Wrapped: Integer {
var safelyUnwrapped: Wrapped { return self ?? 0 }
}
如果您使用了很多类型,那么您可能需要考虑Leo Dabus的答案:
protocol Defaultable {
static var defaultValue: Self { get }
}
extension Optional where Wrapped: Defaultable {
var unwrappedValue: Wrapped { return self ?? Wrapped.defaultValue }
}
通过这种方式,您可以非常轻松地扩展您的类型:
extension Int: Defaultable {
static var defaultValue: Int { return 0 }
}
extension String: Defaultable {
static var defaultValue: String { return "" }
}
extension Array: Defaultable {
static var defaultValue: Array<Element> { return [] }
}
如果您使用了很多类型,那么您可能需要考虑Leo Dabus的答案:
protocol Defaultable {
static var defaultValue: Self { get }
}
extension Optional where Wrapped: Defaultable {
var unwrappedValue: Wrapped { return self ?? Wrapped.defaultValue }
}
通过这种方式,您可以非常轻松地扩展您的类型:
extension Int: Defaultable {
static var defaultValue: Int { return 0 }
}
extension String: Defaultable {
static var defaultValue: String { return "" }
}
extension Array: Defaultable {
static var defaultValue: Array<Element> { return [] }
}
您还可以使用以下代码实现:
extension Optional {
func defaultValue(_ val: Wrapped) -> Wrapped { return self ?? val }
}
var str: String?
str.defaultValue("User")
var a: Int?
a.defaultValue(2)
这将适用于两种数据类型。您也可以使用以下代码实现:
extension Optional {
func defaultValue(_ val: Wrapped) -> Wrapped { return self ?? val }
}
var str: String?
str.defaultValue("User")
var a: Int?
a.defaultValue(2)
这对这两种数据类型都有效。我不确定我会建议实现这样一个计算属性——只是说someOptionalString??“
更短,更清楚地表达您的意图。是的,也是这样。我认为这是关于编程风格和可读性的。选项具有语义意义。如果计算结果为零,则表示“无”,其中无不等于零。通过实现默认值,您将丢失这些信息。我不确定我是否建议实现这样一个计算属性–只是说someOptionalString??“
更短,更清楚地表达您的意图。是的,也是这样。我认为这是关于编程风格和可读性的。选项具有语义意义。如果计算结果为零,则表示“无”,其中无不等于零。通过实现默认值,您将丢失此信息。