首页 > 解决方案 > 泛型,默认值为 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

标签: swiftgenerics

解决方案


我会用两个独立的初始化器来做到这一点,其中一个不需要有一个未使用的泛型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)
    }
}

推荐阅读