你能严格泛型类型或给一个参数多于一种类型吗?
Can you Strict Generic types or give one parameter more than one type ?
例如,我想指定一个可能是 Integer
或 String
的类型,并将其用作 func
中的特殊类型 我试过 typealias
但它不会解决这个问题,因为 typealiases 不能有 or
参数,因为它只使用 &
因此考虑下面的情况。
typealias alis = StringProtocol & Numeric
func foo <T: alis> (vee: T) -> T{
// do something
return vee
}
我希望这个 func 接受参数类型(Int
或 String
)而不是其他任何类型(<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 实现吗?如果是这样的话。
假设您可以使用 OR 运算符来组合协议,您可以用 (Int | String)
类型的东西做什么?
并非您可以对 Int
执行的所有操作都可以在 (Int | String)
上完成,因为它可能是一个潜在的字符串。同样,并非您可以对 String
执行的所有操作都可以在 (Int | String)
上完成,因为它可能是 Int
的基础。
现在你可能会说 "Ah. I know that Int
and String
both have a description
property. I should be able to access description
on a variable of type (Int | String)
."
好吧,那样的话,你可以自己创建这样一个协议,并且只有 Int
和 String
符合它:
protocol IntOrString {
var description: String { get }
}
extension Int : IntOrString {}
extension String : IntOrString {}
(注意description
已经在CustomStringConvertible
中定义了。为了论证,假设它不存在。)
例如,我想指定一个可能是 Integer
或 String
的类型,并将其用作 func
中的特殊类型 我试过 typealias
但它不会解决这个问题,因为 typealiases 不能有 or
参数,因为它只使用 &
因此考虑下面的情况。
typealias alis = StringProtocol & Numeric
func foo <T: alis> (vee: T) -> T{
// do something
return vee
}
我希望这个 func 接受参数类型(Int
或 String
)而不是其他任何类型(<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 实现吗?如果是这样的话。
假设您可以使用 OR 运算符来组合协议,您可以用 (Int | String)
类型的东西做什么?
并非您可以对 Int
执行的所有操作都可以在 (Int | String)
上完成,因为它可能是一个潜在的字符串。同样,并非您可以对 String
执行的所有操作都可以在 (Int | String)
上完成,因为它可能是 Int
的基础。
现在你可能会说 "Ah. I know that Int
and String
both have a description
property. I should be able to access description
on a variable of type (Int | String)
."
好吧,那样的话,你可以自己创建这样一个协议,并且只有 Int
和 String
符合它:
protocol IntOrString {
var description: String { get }
}
extension Int : IntOrString {}
extension String : IntOrString {}
(注意description
已经在CustomStringConvertible
中定义了。为了论证,假设它不存在。)