你可以严格限制泛型类型或者给一个参数指定多个类型吗?

3
例如,我想指定一种类型,可能是整数(Integer)字符串(String),并将其用作func中的特殊类型。我尝试使用typealias,但无法解决此问题,因为typealias不能将or参数用作唯一的使用&,因此请考虑下面的情况。
typealias alis = StringProtocol & Numeric


func foo <T: alis> (vee: T) -> T{
// do something
    return vee
}

我希望这个函数可以接受参数类型为(IntString)的任何一个,而不是其他任何类型(<T>)。
正如您所看到的,我尝试了使用 typealias,并且没有编译错误。
然而,尝试使用此函数将导致以下错误。
foo(vee: 1) //Argument type 'Int' does not conform to expected type 'StringProtocol'

并且
foo(vee: "v") //Argument type 'String' does not conform to expected type 'Numeric'

这可以用Swift实现吗?如果可以,怎么做?

1
你希望同时符合这两个要求吗?你可以使用Any,但可能不是最好的解决方案。你的目标是什么? - Leo Dabus
这可行吗?@LeoDabus,这就是我试图要弄清楚的。 - Mohmmad S
就像我所说的,我不知道有任何符合 Numeric 和 StringProtocol 的对象类型。 - Leo Dabus
问题是我们能否组合某些东西来创建那种类型的对象。 - Mohmmad S
为什么不直接创建两个带有不同签名的方法呢? - Leo Dabus
显示剩余6条评论
1个回答

4
假设您可以使用OR运算符来组合协议,那么对于类型为(Int | String)的内容,您能做什么?
并不是所有适用于Int的操作都可以应用于(Int | String),因为它可能是一个字符串。同样地,并不是所有适用于String的操作都可以应用于(Int | String),因为它可能是一个Int。
现在你可能会说:“啊哈,我知道Int和String都有一个description属性。我应该能够在类型为(Int | String)的变量上访问description。”
好吧,在这种情况下,您可以自己创建这样的协议,并只让Int和String符合它:
protocol IntOrString {
    var description: String { get }
}

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

(请注意,description已在CustomStringConvertible中定义。为了论证,假设它不存在。)

(注意:description已经在CustomStringConvertible中定义。为了方便起见,想象一下它不存在。)


很好的答案,所以如果我想使用Int或String作为参数,我只能执行适用于两者的运算符,这是可以接受的。 - Mohmmad S
到目前为止,这已经足够回答问题了。 - Mohmmad S
你只能使用协议中定义的属性。在这种情况下,是 description 属性。 - Leo Dabus
@Tobi 正如 Leo Dabus 所说的那样。如果你想使用其他成员,你需要将它添加到 IntOrString 协议中。 - Sweeper
@Sweeper 是的,我已经想通了。鼓掌,好答案。 - Mohmmad S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接