假设我有这些协议:
protocol SomeProtocol {
}
protocol SomeOtherProtocol {
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我想要一个采用泛型类型的函数,但该类型必须符合SomeProtocol
我可以做的:
func someFunc<T: SomeProtocol>(arg: T) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
但有没有办法为多个协议添加类型约束?
func bothFunc<T: SomeProtocol | SomeOtherProtocol>(arg: T) {
}
Run Code Online (Sandbox Code Playgroud)
类似的东西使用逗号,但在这种情况下,它会启动一个不同类型的声明.这是我尝试过的.
<T: SomeProtocol | SomeOtherProtocol>
<T: SomeProtocol , SomeOtherProtocol>
<T: SomeProtocol : SomeOtherProtocol>
Run Code Online (Sandbox Code Playgroud)
Jia*_*aro 222
您可以使用where子句,该子句允许您指定任意数量的要求(必须满足所有要求),并以逗号分隔
func someFunc<T where T:SomeProtocol, T:SomeOtherProtocol>(arg: T) {
// stuff
}
Run Code Online (Sandbox Code Playgroud)
func someFunc<T: SomeProtocol & SomeOtherProtocol>(arg: T) {
// stuff
}
Run Code Online (Sandbox Code Playgroud)
或更强大的where子句:
func someFunc<T>(arg: T) where T:SomeProtocol, T:SomeOtherProtocol{
// stuff
}
Run Code Online (Sandbox Code Playgroud)
您当然可以使用协议组合(例如protocol<SomeProtocol, SomeOtherProtocol>
),但它的灵活性稍差.
使用where
允许您处理涉及多种类型的情况.
您可能仍希望在多个位置组合协议以便重用,或者只是为组合协议提供有意义的名称.
Jea*_*let 73
你有两种可能性:
你使用了Jiaaro答案中指出的where子句:
func someFunc<T where T : SomeProtocol, T : SomeOtherProtocol>(arg: T) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)您使用协议组合类型:
func someFunc<T : protocol<SomeProtocol, SomeOtherProtocol>>(arg: T) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)nck*_*cke 19
Swift 3.0的发展带来了一些变化.我们的两个选择现在看起来有点不同.
where
在Swift 3.0中使用一个子句:
该where
子句现已移至函数签名的末尾以提高可读性.所以多协议继承现在看起来像这样:
func someFunc<T>(arg: T) where T:SomeProtocol, T:SomeOtherProtocol {
}
Run Code Online (Sandbox Code Playgroud)
protocol<>
在Swift 3.0中使用构造:
使用该protocol<>
构造的组合已被弃用.现在越早protocol<SomeProtocol, SomeOtherProtocol>
看起来像这样:
func someFunc<T:SomeProtocol & SomeOtherProtocol>(arg: T) {
}
Run Code Online (Sandbox Code Playgroud)
引用.
有关更改的更多信息,请where
访问:https://github.com/apple/swift-evolution/blob/master/proposals/0081-move-where-expression.md
而且,有关协议<>构造的更改的更多信息请访问:https://github.com/apple/swift-evolution/blob/master/proposals/0095-any-as-existential.md
Ima*_*tit 12
Swift 3提供多达3种不同的方式来声明您的功能.
protocol SomeProtocol {
/* ... */
}
protocol SomeOtherProtocol {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
&
操作员func someFunc<T: SomeProtocol & SomeOtherProtocol>(arg: T) {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
where
条款func someFunc<T>(arg: T) where T: SomeProtocol, T: SomeOtherProtocol {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
where
子句和&
运算符func someFunc<T>(arg: T) where T: SomeProtocol & SomeOtherProtocol {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
另请注意,您可以使用typealias
以缩短功能声明.
typealias RequiredProtocols = SomeProtocol & SomeOtherProtocol
func someFunc<T: RequiredProtocols>(arg: T) {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
31826 次 |
最近记录: |