![](/img/trans.png)
[英]How to implement to a generic protocol, which has a function using the Type of associatedtype?
[英]How to require a generic type implement a generic protocol using a specific type in the protocol
嗨,我在当前的项目中使用泛型。 但是,我遇到了一个问题:
我需要一个通用函数foo<T>
才能使用特定类型获取符合通用协议的参数。
例如在Java中,我可以这样做:
public interface Proto<B> {
public void SomeFunction()
}
public class SampleClass {
}
public class Conforms extends Proto<SampleClass> {
@Override
public void SomeFunction () {}
}
public class TestingClass {
public void Requires (Proto<SampleClass> param) {
// I can use param
}
}
我如何在Swift中执行相同的Requires()
函数? 我知道在Swift中你在泛型协议中使用了typealias
。 如何约束基础上的一个参数typealias
?
原型似乎不具备仿制药的方式类和结构在斯威夫特做,但你可以有关联与类型typealias
,这是接近。
您可以使用类型约束来确保传入的对象采用带有类型约束的Proto
。 为了使Proto
传递到require
有正确的B
,你用where
。
关于泛型的苹果文档有很多信息。
这篇博文也是关于使用泛型做更复杂的事情的一个很好的信息来源。
protocol Proto {
typealias B
func someFunction()
}
class SampleClass {}
class Conforms : Proto {
typealias B = SampleClass
func someFunction() { }
}
class TestingClass {
func requires<T: Proto where T.B == SampleClass>(param: T) {
param.someFunction()
}
}
您可以使用where
子句指定泛型的多个要求。 我认为你的例子转化为这个,但它崩溃了Xcode。 公测!
protocol Proto {
func someFunction()
}
class SampleClass {
}
class Conforms: SampleClass, Proto {
func someFunction() {
}
}
class TestingClass {
func requires<T: SampleClass >(param: T) where T: Proto {
param.someFunction() // it's this line that kills Xcode
}
}
let testingClass = TestingClass()
let conforms = Conforms()
testingClass.requires(conforms)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.