无法将可选作为可选返回



为什么我不能让 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 '?'?
}
}

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

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

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)
}

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

你可能想要声明一个这样的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: BlahnBlah

但在我看来,所有这些只会给Optional的简单类型增加不必要的复杂性。因此,您可能希望扩展您在此处尝试实现的目标。

相关内容

  • 没有找到相关文章

最新更新