在Swift中实现“Either”结构

在Swift中实现“Either”结构,第1张

概述有人可以解释下面的代码中发生了什么?它创建一个struct Either,它接受任意两个可选类型,并且(尝试)返回哪个不是nil,或者如果两个都不是nil则返回第一个.然而,当传递文字nil而不是nil变量时,它表现得很奇怪.我不明白为什么示例中的b4表现得像…… struct Either <T1, T2> { let first: T1? let second: T2? 有人可以解释下面的代码中发生了什么?它创建一个struct Either,它接受任意两个可选类型,并且(尝试)返回哪个不是nil,或者如果两个都不是nil则返回第一个.然而,当传递文字nil而不是nil变量时,它表现得很奇怪.我不明白为什么示例中的b4表现得像……

struct Either <T1,T2> {    let first: T1?    let second: T2?    init(first: T1?,second: T2?) {        self.first = first        self.second = second    }    func either() -> Bool {        return (self.first != nil) || (self.second != nil)    }    func which() -> Any? {        if self.first != nil {            return self.first        } else if self.second != nil {            return self.second        }        return nil    }}var s1: String? = nilvar s2: Int? = nillet b1 = Either(first: s1,second: s2)b1.either() // falseb1.which() // {nil}s1 = "Hello"let b2 = Either(first: s1,second: s2)b2.either() // trueb2.which()  // {Some Hello}s1 = nils2 = 7let b3 = Either(first: s1,second: s2)b3.either() // trueb3.which()  // {Some 7}// all as expected,howeverlet b4 = Either(first: nil,second: nil)b4.either() // true !!! <<<<<<<<<<<<<<<<<<b4.which()  // {nil}

我认为它与“可选的选项”有关,但我不确定它是否符合预期.

解决方法 这已在Beta 3中修复,最后一种情况现在正确触发编译器错误,迫使您明确指定泛型类型

问题在于类型 – 从文字创建Either时:

let b4 = Either(first: nil,second: nil)

然后编译器无法推断出nil参数的类型.如果检查调试器,您将看到推断类型是一个名为_Nil的类型.

(lldb) p b4(SwiftConsole.Either<_Nil,_Nil>) $R1 = {  first = Some  second = Some}

现在,这是一个接受nil的类型,但它本身不是一个可选类型.

let x: _Nil = nil //this is not an optional

初始化器正在对它进行选择,因此将值设为Optional.some(nil),因为它是.some(…)值,将它与nil进行比较将为false.

我没有看到任何简单的通用解决方法,但在这种情况下,它将有助于明确指定泛型类型:

let b4 = Either<String,Int>(first: nil,second: nil)

我建议你报告一个错误,因为这只是愚蠢的.编译器应该反而触发错误,而不是推断一些导致未定义行为的特殊类型.

类型为Any会出现同样的问题,因为它也可以接受nil而不是可选的.

let x: Any = nil //this is not an optionalEither<Any,Any>(first: nil,second: nil).which() //true !!!

编辑:
这将在Beta 3中修复.nil将成为文字,_Nil类型将被删除,_Any将不再接受nil.

在此确认:https://devforums.apple.com/thread/234463?tstart=0

总结

以上是内存溢出为你收集整理的在Swift中实现“Either”结构全部内容,希望文章能够帮你解决在Swift中实现“Either”结构所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1007170.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-22
下一篇2022-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存