gpt4 book ai didi

swift - Swift 中的多可选类型

转载 作者:搜寻专家 更新时间:2023-10-31 22:09:35 25 4
gpt4 key购买 nike

我很好奇为什么 Swift 不会自动将 Multi-Optional 类型转换为 Optional?假设我们有这段代码:

var a: Int?? = 2
var b: Int? = a //error

所有情况:

       Optional<Optional<2>>
/\
.none .some(Optional(Int))
/\
.none .some(2)

所以所有情况都是:.none , .some(.none) , .some(2) .目前 Swift 自动转换 TypeOptional<Type>那为什么不对 .some(.none) 做同样的事情呢?至 .none ?我已经用扩展方法部分解决了这个问题,但例如 4-Optional , 方法应该被调用 2 次,这是不好的:

extension Optional {
public func flatten<Result>() -> Result?
where Wrapped == Result?
{
return self.flatMap { $0 }
}
}

最佳答案

我认为对于第一个代码片段,您的意思是:

var a: Int? = 2
var b: Int?? = a

编译没有错误。 Swift 可以隐式转换 Int?Int?? , 与转换 Int 的方式相同至 Int?

您的代码段:

var a: Int?? = 2
var b: Int? = a

不编译因为 Swift 不能隐式转换 Int??Int? ,就像它不能从 Int? 转换一样至 Int含蓄地。

基本上,Swift 可以隐式包装可选项,但不能隐式取消包装它们。

Currently Swift automatically converts Type to Optional<Type> then why not do the same with .some(.none) to .none

你说的这两个转化是不一样的。从 Type 转换而来至 Optional<Type>总是有效,这在编译时是已知的。但是,从 .some(.none) 转换至 .none并不总是可能的,因为只有在运行时你才知道一个可选的是否是 .some.none ,所以 Swift 说“不,我对此不确定,所以我不允许这样做”。

换句话说,从.some(.none)转换至 .none ,你需要强制解包:

let a: Int?? = .some(nil)

if case .some(.none) = a {
print(".some(.none) confirmed")
}

let b: Int? = a! // force unwrap here

if case .none = b {
print(".none confirmed")
}

否则 Swift 会说“如果外部可选是 .none 怎么办?”并产生您看到的编译器错误。

编辑:

如果你想创建一个函数来扁平化一个可选的,你实际上不需要写这样一个函数! as?运算符(operator)已经完成了这项工作!

let a: Int??????? = 2
let b: Int? = a as? Int // as? unwraps every nested optional!

关于swift - Swift 中的多可选类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53006901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com