Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift:返回运行时随机不透明类型会生成错误_Swift_Type Mismatch_Mismatch_Opaque Types - Fatal编程技术网

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

Swift:返回运行时随机不透明类型会生成错误,swift,type-mismatch,mismatch,opaque-types,Swift,Type Mismatch,Mismatch,Opaque Types,我现在正在学习不透明类型,仍然有点困惑。我尝试了以下方法: protocol Animal { func introduce() } struct Dog: Animal { func introduce() { print("Dog") } } struct Cat: Animal { func introduce() { print("Cat") } } func rando

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

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
的返回行中,我得到以下错误

“?:”中的结果值表达式具有不匹配的类型“Cat”和“Dog”

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

我说得对吗?如果我是,这条消息是不是让人困惑,因为两个结构都实现了
Animal
?如果我错了,这个错误消息是什么意思

非常感谢


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

考虑一下:表达式值的类型是什么?猫:狗
它不是动物。对于三元体,你需要一种类型,但你要么有猫,要么有狗。类型推断不会发现您可以将这两种不同的类型删除回某个公共类型,即使可以这样做

,但如果我删除一些,它就会编译。是因为在这种情况下,swift返回的是一个存在容器而不是具体类型吗?@Yotam阅读了上面评论中链接的问题。是的,如果你返回一个动物,这意味着它可以为三元表达式推断动物。两样东西都可以一样的话,三元是幸福的。但对于某些动物来说,情况并非如此,因为这意味着你返回的是一只真正的猫,比如说,或者一只真正的狗。打电话的人可以把它当成某种动物,但那是下游。有些动物不是一种类型,所以不能统一这两种三元类型。@JoakimDanielson,我说的,不够清楚。不管怎样,我想我明白了。谢谢