您好我在当前的项目中使用泛型。但是,我遇到了一个问题:
我需要一个通用函数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
?
答案 0 :(得分:14)
原型似乎没有类和Swift中类和结构一样的泛型,但是你可以使用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()
}
}
。
Apples documentation on generics有很多信息。
This blog post也是使用泛型做更复杂事情的一个很好的信息来源。
{{1}}
答案 1 :(得分:7)
您可以使用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)