首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将optional作为optional返回

无法将optional作为optional返回
EN

Stack Overflow用户
提问于 2017-07-10 23:03:02
回答 2查看 70关注 0票数 0

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

我有一个函数,它检查optional是否包含值,如果不包含,则将其作为optional返回:

代码语言:javascript
复制
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 '?'?
    }
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-11 00:14:16

您可能希望像这样声明一个enum

代码语言:javascript
复制
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

代码语言:javascript
复制
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类型增加不必要的复杂性。因此,您可能希望在这里扩展您正在尝试实现的目标。

票数 1
EN

Stack Overflow用户

发布于 2017-07-10 23:12:08

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

代码语言:javascript
复制
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)
}

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45015500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档