swift - 泛型,默认值为 nil
问题描述
我正在尝试创建一个通用类/结构初始化程序,它可以转换它接收的任何值并将其分配给它的 Double 属性。(注意:下面的 as! 或 as? 模式只是用来节省空间。我实际上是在使用这个扩展来转换我的值。)
这里的想法是我希望能够混合整数、双精度、CGFloats 等(即数字泛型类型约束中的任何内容)并让它们最终都作为双精度。它适用于其他情况,但我在这里遇到了一个问题。
在下面的精简示例中,我正在创建一个 Vector 类,z
如果我们只处理二维,该属性应该能够为 nil。
struct Vector {
var x: Double
var y: Double
var z: Double?
public init<X: Numeric, Y: Numeric, Z: Numeric>(_ x: X, _ y: Y, _ z: Z? = nil){
self.x = x as! Double
self.y = y as! Double
self.z = z as? Double
}
}
var myVector = Vector(4, 3.4)
print("""
\(myVector.x)
\(myVector.y)
\(myVector.z)
"""
)
问题是我收到一条错误消息Generic parameter 'Z' could not be inferred
。
解决方案
我会用两个独立的初始化器来做到这一点,其中一个不需要有一个未使用的泛型Z
:
struct Vector {
var x: Double
var y: Double
var z: Double?
}
extension Vector {
public init<X: Numeric, Y: Numeric>(_ x: X, _ y: Y) {
self.init(x: x as! Double, y: y as! Double, z: nil as Double?)
}
public init<X: Numeric, Y: Numeric, Z: Numeric>(_ x: X, _ y: Y, _ z: Z? = nil) {
self.init(x: x as! Double, y: y as! Double, z: z as? Double)
}
}
推荐阅读
- calendar - 同一时间段内的最大事件数 - Google 日历
- git - `git-add --refresh` 有什么作用?
- reactjs - 如何为评分中的每个 1 显示一个星?
- python - 命令引发异常:NameError: name 'convert' is not defined
- logic - 直觉命题逻辑
- javascript - 全局变量未更新
- python - 如何限制 Django 的内置身份验证允许的用户名字符?
- java - 如何实现 OnLongClickListener 到 BottomNavigation 菜单项长按?
- python - 可以将 conda 配置为使用私有 pypi 存储库吗?
- data-structures - 用数组打印偶数