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

Zen*_*ton 9 generics protocols ios swift

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

我需要一个通用函数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
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何Requires()在Swift中执行相同的功能?我知道你在Swift中使用typealias协议进行泛型.如何根据typealias?约束参数?

小智 14

原型似乎没有类和结构在Swift中做的泛型,但是你可以使用相关的类型typealias,它们很接近.

您可以使用类型约束来确保传入的对象采用Protowith类型约束.为了让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()
    }
}
Run Code Online (Sandbox Code Playgroud)


Nat*_*ook 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)
Run Code Online (Sandbox Code Playgroud)