Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展默认值的swift选项_Swift - Fatal编程技术网

扩展默认值的swift选项

扩展默认值的swift选项,swift,Swift,我试图用默认值扩展Swift的可选的类型。在API请求中提供空值会引发异常。我已经对字符串类型执行了此操作,但是对于整数类型,我无法实现相同的结果: extension Optional where Wrapped == String { var unwrappedValue: String { get { switch self { case .some(let value): ret

我试图用默认值扩展Swift的
可选的
类型。在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??“
更短,更清楚地表达您的意图。是的,也是这样。我认为这是关于编程风格和可读性的。选项具有语义意义。如果计算结果为零,则表示“无”,其中无不等于零。通过实现默认值,您将丢失此信息。