加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:30:24 所属栏目:百科 来源:网络整理
导读:我无法弄清楚如何进行演员表演让我最终能够引入一些与泛型一起工作的动态. 下一段代码无法编译.它显示了这个错误: Cannot invoke ‘createContainer’ with an argument list of type ‘(FooProtocol)’ Expected an argument list of type ‘(T)’ protoco
我无法弄清楚如何进行演员表演让我最终能够引入一些与泛型一起工作的动态.

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

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
    }
}

// Later
func createContainer(data: FooProtocol){
    Container(someDataConformingFooProtocol: data)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读