大佬教程收集整理的这篇文章主要介绍了Swift:泛型和类型约束,奇怪的行为,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
protocol FooProtocol { func doSomething() } class Foo : FooProtocol { func doSomething() {} } class Container<T : FooProtocol> { let someDataConformingFooProtocol : T init(someDataConformingFooProtocol : T) { self@L_963_3@meDataConformingFooProtocol = 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) } }@H_944_10@这真的是预期的行为吗?因为我个人无法理解编译器抱怨它的原因或原因.
什么是合适的演员?没有引用具体类,我的意思是不喜欢这样:
if let foo2Maskchecked = foo2Mask as? Foo@H_944_10@谢谢!
func foo(_ i: FooProtocol)@H_944_10@我正在接受类型为FooProtocol的实例,因此我可以传入一个符合FooProtocol的值,或者它的类型是FooProtocol.这类似于子类化,您可以将SuperClass和SubClass传递给SuperClass.
但是如果你有这样的功能:
func foo<T>(_ i: T) where T: FooProtocol@H_944_10@我可以传入任何符合FooProtocol的类型,但由于FootProtocol不符合自身,你无法传递它.
所以在你的问题中,你试图传入一个类型FooProtocol,其中的类型必须符合FooProtocol.您可以通过以下方式解决此问题:
class Container { let someDataConformingFooProtocol: FooProtocol init(someDataConformingFooProtocol: FooProtocol) { self@L_963_3@meDataConformingFooProtocol = someDataConformingFooProtocol } } // Later func createContainer(data: FooProtocol){ Container(someDataConformingFooProtocol: data) }@H_944_10@
以上是大佬教程为你收集整理的Swift:泛型和类型约束,奇怪的行为全部内容,希望文章能够帮你解决Swift:泛型和类型约束,奇怪的行为所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。