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,我说的,不够清楚。不管怎样,我想我明白了。谢谢