如何要求泛型类型使用协议中的特定类型实现通用协议

时间:2014-07-03 18:02:30

标签: ios generics swift protocols

您好我在当前的项目中使用泛型。但是,我遇到了一个问题:

我需要一个通用函数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

约束参数

2 个答案:

答案 0 :(得分:14)

原型似乎没有类和Swift中类和结构一样的泛型,但是你可以使用typealias的关联类型。

您可以使用类型约束来确保传入的对象采用带有类型约束的Proto。要将Proto传递给requireB使用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)