Swift:泛型和类型约束,奇怪的行为

Swift:泛型和类型约束,奇怪的行为,第1张

概述我无法弄清楚如何进行演员表演让我最终能够引入一些与泛型一起工作的动态. 下一段代码无法编译.它显示了这个错误: Cannot invoke ‘createContainer’ with an argument list of type ‘(FooProtocol)’ Expected an argument list of type ‘(T)’ protocol FooProtocol { 我无法弄清楚如何进行演员表演让我最终能够引入一些与泛型一起工作的动态.

下一段代码无法编译.它显示了这个错误:

Cannot invoke ‘createContainer’ with an argument List of type
‘(FooProtocol)’ Expected an argument List of type ‘(T)’

protocol FooProtocol {    func doSomething()}class Foo : FooProtocol {    func doSomething() {}}class Container<T : FooProtocol> {    let someDataConformingFooProtocol : T    init(someDataConformingFooProtocol : T) {        self.someDataConformingFooProtocol = someDataConformingFooProtocol    }}class AllTogether {    init () {        createContainer(Foo()) //So far,so good        let foo2Mask : AnyObject = Foo()        if let foo2MaskChecked = foo2Mask as? FooProtocol {            createContainer(foo2MaskChecked)            //ERROR: Cannot invoke 'createContainer' with an argument List of type '(FooProtocol)'            //Expected an argument List of type '(T)'        }    }    func createContainer<T : FooProtocol>(data: T){        Container<T>(someDataConformingFooProtocol: data)    }}

这真的是预期的行为吗?因为我个人无法理解编译器抱怨它的原因或原因.

什么是合适的演员?没有引用具体类,我的意思是不喜欢这样:

if let foo2MaskChecked = foo2Mask as? Foo

谢谢!

解决方法 它归结为T:FooProtocol和FooProtocol之间的区别,正如@Hamish在评论中提到的那样.

当我有这样的功能:

func foo(_ i: FooProtocol)

我正在接受类型为FooProtocol的实例,因此我可以传入一个符合FooProtocol的值,或者它的类型是FooProtocol.这类似于子类化,您可以将SuperClass和SubClass传递给SuperClass.

但是如果你有这样的功能:

func foo<T>(_ i: T) where T: FooProtocol

我可以传入任何符合FooProtocol的类型,但由于FootProtocol不符合自身,你无法传递它.

所以在你的问题中,你试图传入一个类型FooProtocol,其中的类型必须符合FooProtocol.您可以通过以下方式解决此问题:

class Container {    let someDataConformingFooProtocol: FooProtocol    init(someDataConformingFooProtocol: FooProtocol) {        self.someDataConformingFooProtocol = someDataConformingFooProtocol    }}// Laterfunc createContainer(data: FooProtocol){    Container(someDataConformingFooProtocol: data)}
总结

以上是内存溢出为你收集整理的Swift:泛型和类型约束,奇怪的行为全部内容,希望文章能够帮你解决Swift:泛型和类型约束,奇怪的行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/999897.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存