例如,我想指定一个可能是Integer
或String
的类型,并在我尝试过func
的{{1}}中将它用作特殊类型
但是它不能解决这种情况,因为类型别名不能包含typealias
参数,因为它仅使用or
,因此请考虑以下情况。
&
我希望此函子接受(typealias alis = StringProtocol & Numeric
func foo <T: alis> (vee: T) -> T{
// do something
return vee
}
或Int
)而不是其他任何参数(String
)的参数类型,
如您所见,我尝试使用typealias并且没有编译错误。
但是,尝试使用该功能将导致这些错误。
<T>
还有
foo(vee: 1) //Argument type 'Int' does not conform to expected type 'StringProtocol'
这可以迅速实现吗?如果可以的话。
答案 0 :(得分:4)
让我们假设您可以使用“或”运算符来组合协议,那么对(Int | String)
类型的东西该怎么办?
并非所有可以对Int
进行的操作都可以在(Int | String)
上完成,因为它可能是一个潜在的字符串。同样,并不是您可以对String
做的所有事情都可以在(Int | String)
上完成,因为从根本上说,它可能是Int
。
现在您可能会说:“啊。我知道Int
和String
都具有description
属性。我应该能够通过类型为变量的变量访问description
(Int | String)
。”
在这种情况下,您可以自己创建一个这样的协议,并且仅使Int
和String
符合该协议:
protocol IntOrString {
var description: String { get }
}
extension Int : IntOrString {}
extension String : IntOrString {}
(请注意,description
中已经定义了CustomStringConvertible
。为争辩起见,假设它不存在。)