无法将可选项作为可选项返回

时间:2017-07-10 15:03:02

标签: swift function optional

为什么我不能让Swift将值作为可选值返回。

我有一个功能,检查一个可选项是否包含一个值,如果不是,则将其作为可选项返回:

var someOptional: String?

func checkIfOptional<T>(value: T?) -> (String, T) {
    if let _value = value {
        return (("Your optional contains a value. It is: \(_value)"), (_value))
    } else {
        return (("Your optional did not contain a value"), (value?)) //ERROR: Value of optional type 'T?' not unwrapped; did you mean to use '!' or '?'?
    }
}

当可选项为零时。我应该返回与函数相同的可选项。 如果有价值。它应该返回未包装的值。

2 个答案:

答案 0 :(得分:4)

如果要返回可选项,则必须将返回类型声明为可选

func checkIfOptional<T>(value: T?) -> (String, T?) {
    if let _value = value {
        return ("Your optional contains a value. It is: \(_value)", value)
    } else {
        return ("Your optional did not contain a value", value)
        // or even  return ("Your optional did not contain a value", nil)
}

我删除了所有不必要的括号。

答案 1 :(得分:1)

您可能想要声明enum,如下所示:

enum Value<T> {
    case full(String, T)
    case empty(String, T?)
}

func checkIfOptional<T>(_ value: T?) -> Value<T> {
    if let _value = value {
        return .full("Your optional contains a value. It is: \(_value)", _value)
    } else {
        return .empty("Your optional did not contain a value.", value)
    }
}

var toto: String?

print(checkIfOptional(toto))   // empty("Your optional did not contain a value", nil)
print(checkIfOptional("Blah")) // full("Your optional contains a value. It is: Blah", "Blah")

要处理Value,您应该以这种方式使用switch

var toto: String?

let empty = checkIfOptional(toto)
let full = checkIfOptional("Blah")

func treatValue<T>(_ value: Value<T>) {
    switch(value) {
        case .full(let msg, let val):
            print(msg)
            print(val)
        case .empty(let msg, _):
            print(msg)
    }
}

treatValue(empty) // Your optional did not contain a value.
treatValue(full)  // Your optional contains a value. It is: Blah\nBlah

但在我看来,所有这些只会给Optional这种直截了当的类型增加不必要的复杂性。所以你可能想要扩展你想要实现的目标。