swift - 无法将类型 'Generic<String>' 的值转换为预期的参数类型 'Generic<Any>'

标签 swift generics compiler-errors swift3

我很困惑......我什至不知道编译器认为可能会发生什么,但我 90% 确定这应该是可能的:

class Generic<Type: Any> {

}

protocol Foo {
    func bar(_ baz: Generic<Any>)
}

class SomeFoo: Foo {
    func bar(_ baz: Generic<Any>) {
        print("Got", baz)
    }
}

let someFoo = SomeFoo()
let generic = Generic<String>()

someFoo.bar(generic) // Compile error: Cannot convert value of type 'Generic<String>' to expected argument type 'Generic<Any>'

这是怎么回事,解决方法是什么?当然必须有一些解决方法......

最佳答案

这称为协方差,Swift 中的用户类型不支持它(据我所知,数组除外)。顺便说一句,Objective-C 泛型以某种方式支持协变。
在您的情况下,我会从 2 个选项中进行选择:

  1. 使条形图功能通用
  2. 创建将被 foo 函数接受的非通用协议(protocol),并在您的 Generic 类中实现该协议(protocol)

关于swift - 无法将类型 'Generic<String>' 的值转换为预期的参数类型 'Generic<Any>',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41516327/

相关文章:

java - 仅适用于特定类型的通用类

java - 为什么 compareTo() 有自己的实现体,而 Comparable 是一个接口(interface)?

ios - Swift 不在文本字段中显示所有文本

ios - 无法单击自定义 UICollectionViewCell 内容

java - 为什么我收到警告 Unchecked assignment?

f# - 涉及 “Expected incomplete structured construct”的级联错误

java - 此处不允许出现“Void”类型错误

c - 如何在函数中打印 void * 以及如何在函数中访问 void * 变量?

ios - XCode6 Beta 中的编译器警告 - “Shorthand External Parameter Names”

xcode - Realm 错误 : Migration