swift - Swift - 可选的泛型类型
问题描述
在 Swift 中,是否可以将泛型类型设为可选?例如,我想U
在下面的类中将泛型类型设为可选。
class GenericClass<T, U> {
public var t: T
public var u: U?
init(t: T) {
self.t = t
}
init(t: T, u: U) {
self.t = t
self.u = u
}
}
let i1 = GenericClass(t: 1) // Generic parameter 'U' could not be inferred
let i2 = GenericClass(t: 1, u: "a")
我知道我能做到
let i1 = GenericClass<Int, Any>(t: 1) // no error
let i2 = GenericClass(t: 1, u: "a")
有没有办法在不设置未使用类型的情况下完成这项工作U
?
解决方案
没有未使用的类型。类型系统需要知道所有变量的类型,如果你声明一个带有 2 个泛型类型参数的泛型类型,那么两者都需要有一个类型。
即使 的值u
在nil
时init
,它仍然需要一个特定的类型,因为Optional
它本身是一个泛型类型,所以你需要告诉编译器是什么Optional<U>
。
此外,除非您将u
其设为不可变,否则您不能仅通过不在init
. (实际上你确实给了它一个值,它只是默认为nil
)。
所以答案是否定的,你不能在GenericClass
不同时指定T
and的情况下实例化你的U
。
推荐阅读
- c# - Vector3.Lerp() 末尾的“分数”值是多少?统一声明
- docker - Docker推送“拒绝:请求的资源访问被拒绝”
- javascript - 如何使用 Javascript 将查询参数附加到我的 URL?
- javascript - 使用 React 和 Redux 制作确认模式
- c - 我需要/可以在 C 中释放 void 指针吗?
- node.js - 动态cron参数_Node Js
- .net - NU1100:无法解析 '.NETCoreApp,Version=v3.1' 的 'Microsoft.NET.Sdk.Functions (>= 3.0.3)'
- python-3.x - 在python中使用for each循环打印出字符串中的字符数?
- c++ - 为什么 C++ 模板函数`auto`返回类型推导在 GCC 上失败,但在 Clang 和 MSVC 上有效
- php - PHP中2个日期之间的计算