当前位置: 首页 > 知识库问答 >
问题:

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

周龙光
2023-03-14

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

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?如果我错了,这个错误消息是什么意思?

谢谢

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

共有1个答案

王才
2023-03-14

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

 类似资料:
  • 具有不透明返回类型的函数或者方法会隐藏它返回值的类型信息。相对于提供具体的类型作为函数的返回类型,返回值根据它支持的协议进行描述。隐藏类型信息在模块和调用模块的代码之间的边界处很好用,因为返回值的具体类型可以保持私有。不同于返回一个协议类型的值,不透明类型保持了类型的身份——编译器可以访问类型的信息,但模块的客户端不能。 不透明类型解决的问题 比如说,你在写一个模块来使用 ASCII 绘制图像。最

  • 不透明类型 具有不透明返回类型的函数或方法会隐藏返回值的类型信息。函数不再提供具体的类型作为返回类型,而是根据它支持的协议来描述返回值。在处理模块和调用代码之间的关系时,隐藏类型信息非常有用,因为返回的底层数据类型仍然可以保持私有。而且不同于返回协议类型,不透明类型能保证类型一致性 —— 编译器能获取到类型信息,同时模块使用者却不能获取到 苹果官方示例代码: protocol Shape {

  • 问题内容: 我需要创建一个 Java 方法以返回或随机返回。我怎样才能做到这一点? 问题答案: 该类已经具有此功能: 但是,每次需要随机布尔值时始终创建一个新实例并不高效。相反,请在您的类中创建需要随机布尔值的type属性,然后为每个新的随机布尔值使用该实例:

  • 这是一个关于PHP单元测试的问题,给出了一个类NotFound错误。 背景资料 我正在使用Zend Studio 10.5开发Zend Framework 2应用程序。我加载了一些模块,包括和 FedcoUser是具有使用BJYAAuthorize的保护规则的控制器保护的模块: 使用Zend Studio 10.5本机菜单,我为上面的控制器创建了一个测试用例。当我运行它时,我得到以下错误: 我的假

  • 在典型的 Rust 函数中,返回的值若是有个错误的类型,将导致出现如下所示的错误: error[E0308]: mismatched types --> src/main.rs:2:12 | 1 | fn foo() { | - expected `()` because of default return type 2 | return "foo" |

  • 本文向大家介绍C#产生随机双,包括了C#产生随机双的使用技巧和注意事项,需要的朋友参考一下 示例 生成介于0和1.0之间的随机数。(不包括1.0)