扩展swift可选的默认值

时间:2017-05-26 10:40:58

标签: swift

我正在尝试使用默认值扩展Swift的Optional类型。在API请求中提供空值应该引发异常。我已针对String类型执行此操作,但我无法使用Integer类型获得相同的结果:

extension Optional where Wrapped == String {

    var unwrappedValue: String {

        get {
            switch self {

            case .some(let value):
                return value

            case .none:
                return ""
            }
        }
    }
}

Integer版本正在抛出以下Error

  

协议'Integer'只能用作通用约束,因为它   有自我或相关的类型要求

extension Optional where Wrapped == Integer {

    var unwrappedValue: Integer {

        get {
            switch self {

            case .some(let value):
                return value

            case .none:
                return 0
            }
        }
    }
}

3 个答案:

答案 0 :(得分:3)

您只需要返回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 }
}
let optionalInt  = Int("10")
let unwrappedValue = optionalInt.safelyUnwrapped  // 10

答案 1 :(得分:1)

如果您将此用于很多类型,您可能需要考虑以下对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 [] }
}

用法如下:

let optionalInt: Int? = 10 // Optional(10)
let unwrappedInt = optionalInt.unwrappedValue // 10

let optionalString: String? = "Hello" // Optional("Hello")
let unwrappedString = optionalString.unwrappedValue // "Hello"

let optionalArray: [Int]? = nil // nil
let unwrappedArray = optionalArray.unwrappedValue // []

答案 2 :(得分:1)

您还可以使用以下代码实现:

extension Optional {
   func defaultValue(_ val: Wrapped) -> Wrapped { return self ?? val }
}
var str: String?
str.defaultValue("User")

var a: Int?
a.defaultValue(2)

这对两种数据类型都适用。