您可以严格使用泛型类型还是可以给一个参数多于一种类型?

时间:2018-10-24 14:21:51

标签: swift generics protocols

例如,我想指定一个可能是IntegerString的类型,并在我尝试过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'

这可以迅速实现吗?如果可以的话。

1 个答案:

答案 0 :(得分:4)

让我们假设您可以使用“或”运算符来组合协议,那么对(Int | String)类型的东西该怎么办?

并非所有可以对Int进行的操作都可以在(Int | String)上完成,因为它可能是一个潜在的字符串。同样,并不是您可以对String做的所有事情都可以在(Int | String)上完成,因为从根本上说,它可能是Int

现在您可能会说:“啊。我知道IntString都具有description属性。我应该能够通过类型为变量的变量访问description (Int | String)。”

在这种情况下,您可以自己创建一个这样的协议,并且仅使IntString符合该协议:

protocol IntOrString {
    var description: String { get }
}

extension Int : IntOrString {}
extension String : IntOrString {}

(请注意,description中已经定义了CustomStringConvertible。为争辩起见,假设它不存在。)