Swift:返回运行时随机不透明类型会产生错误

Posted

技术标签:

【中文标题】Swift:返回运行时随机不透明类型会产生错误【英文标题】:Swift: returning a runtime random opaque type generates an error 【发布时间】:2021-06-24 15:34:42 【问题描述】:

我现在正在学习 opaque 类型,仍然有点困惑。我尝试了以下方法:

protocol Animal 
    func introduce()


struct Dog: Animal 
    func introduce() 
        print("Dog")
    


struct Cat: Animal 
    func introduce() 
        print("Cat")
    


func random() -> some Animal 
    let value = [true, false].randomElement()!
    return value ? Cat() : Dog()

random 的返回行中,我收到以下错误

Result values in '? :' expression have mismatching types 'Cat' and 'Dog'

所以,据我所知,就像泛型一样,编译器需要能够在编译时决定函数的具体返回类型是什么。

我说的对吗?如果我是,这不是关于混淆的消息,因为两个结构都实现了Animal?如果我错了,这个错误信息是什么意思?

非常感谢

编辑:我试图理解,而不是让它发挥作用:)

【问题讨论】:

***.com/questions/56433665/… 【参考方案1】:

考虑一下:表达式值的类型是什么?猫狗() 它不是动物。对于三元组,您需要一种类型,但您有一只猫或一只狗。类型推断无法确定您可以将这两种不同的类型擦除回某个常见类型,即使可以这样做

【讨论】:

但如果我删除 some 它会编译。是因为在这种情况下 swift 返回一个存在容器而不是具体类型吗? @Yotam 阅读上面评论中链接的问题 是的,如果你返回一个 Animal ,这意味着它可以推断动物的三元表达式。两件事可以一样,三元是快乐的。但对于某些动物而言,情况并非如此,因为这意味着您要归还的是一只真正的猫,或者说是一只真正的狗。调用者可以把它当作某种动物,但那是下游。有些动物不是类型,所以不能统一这两种三元类型。 @JoakimDanielson 我做了,不够清楚。无论如何,我想我明白了。谢谢

以上是关于Swift:返回运行时随机不透明类型会产生错误的主要内容,如果未能解决你的问题,请参考以下文章

学习Swift -- 错误处理

SaveAs 产生不兼容的文件类型和扩展名错误(运行时错误 6294)

如何从 Swift 3 中的不透明指针创建类型化指针?

Swift-错误处理(Error Handling)(十六)

Swift 的演员阵容的运行时成本是多少?

Swift 异常处理