在Swift中返回泛型类型

在Swift中返回泛型类型,swift,generics,return,assign,Swift,Generics,Return,Assign,我有一个类,它有两个泛型对象数组: public class Scene { objects:[Geometry<BSDF>] lights:[Geometry<Emitter>] ... 公共类场景{ 对象:[几何体] 灯光:[几何] ... 我有一个函数,我想从这些数组中的任何一个返回一些元素: public func hit<M>(origin:Vec, direction:Vec) -> (Geometry<M>?

我有一个类,它有两个泛型对象数组:

public class Scene {
    objects:[Geometry<BSDF>]
    lights:[Geometry<Emitter>]
...
公共类场景{
对象:[几何体]
灯光:[几何]
...
我有一个函数,我想从这些数组中的任何一个返回一些元素:

public func hit<M>(origin:Vec, direction:Vec) -> (Geometry<M>?,CGFloat) {
    var minDist = CGFloat.greatestFiniteMagnitude
    var minGeometry:Geometry<M>? = nil
    for g in objects {
        let d = g.intersect(origin: origin, direction: direction)
        if (d != 0 && d < minDist) {
            minDist = d
            minGeometry = g
        }
    }
    // Do the same for lights
    return (minGeometry,minDist)
}
public func hit(原点:Vec,方向:Vec)->(Geometry?,CGFloat){
var minDist=CGFloat.greatestfinitemagnity
变量几何:几何?=零
对于g-in对象{
设d=g相交(原点:原点,方向:方向)
如果(d!=0&&d

然而,对于行
minGeometry=g
我得到错误“无法将类型“Geometry的值分配给类型Geometry”我是否误解了泛型是如何工作的,以及我如何创建这样一个函数?

泛型
M
表示单个具体类型。因此,如果
M
表示
发射器,则是doesn不匹配
BSDF
。我明白了,那么如何创建返回BDSF或发射器几何体片段的函数呢?可以使用两种类型都符合的协议。对象必须实现
相交(原点:方向:)
。然后用该协议替换
几何体。