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
,它们很接近.
您可以使用类型约束来确保传入的对象采用Proto
with类型约束.为了让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)
您可以使用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)