Generics Swift泛型虚拟方法调用导致segfault

Generics Swift泛型虚拟方法调用导致segfault,generics,inheritance,swift,virtual-functions,Generics,Inheritance,Swift,Virtual Functions,我是斯威夫特的新手,所以我可能在做一些愚蠢的事情。如果是,太好了:请告诉我在哪里 在下面的代码中,您将看到类派生的继承自泛型类基: 代码编译得很好,但是当调用Derived.method时,我得到一个segfault。根据我到目前为止的调试,看起来self指针在Container.method中是正确的,但是一旦进入派生的.method,指针就错了。可能是堆栈损坏了 对这段代码的各种细微更改使其工作正常(尽管语义不同)。有人能解释一下这是怎么回事吗?在我对Swift有更多了解之前,我很犹豫是否建

我是斯威夫特的新手,所以我可能在做一些愚蠢的事情。如果是,太好了:请告诉我在哪里

在下面的代码中,您将看到类
派生的
继承自泛型类

代码编译得很好,但是当调用
Derived.method
时,我得到一个segfault。根据我到目前为止的调试,看起来
self
指针在
Container.method
中是正确的,但是一旦进入
派生的.method
,指针就错了。可能是堆栈损坏了


对这段代码的各种细微更改使其工作正常(尽管语义不同)。有人能解释一下这是怎么回事吗?在我对Swift有更多了解之前,我很犹豫是否建议使用编译器错误。

您肯定在编译器或运行时发现了一个错误–编写这样的代码时不可能出现segfault。它要么运行正常,要么编译失败。您甚至不需要容器类,您可以使用

let d: Base = Derived<Int>()
d.method(2)

这种方法还有一个额外的好处,即如果您希望将
D
作为值类型(即结构),因为它们不能继承,但可以继承。

感谢您的详细回复。您提到“使派生类成为泛型的要求是有原因的”。除了缺少一个特性之外,你知道原因是什么吗?我也很感谢你对我发布的代码的设计建议。不幸的是,我确实需要在我正在构建的真实代码中利用虚拟方法调用。带有
typealias
的协议不能被视为抽象类,只能作为类型约束。这就是为什么我重构代码以使用继承,这就是这个bug出现的地方。我在一定程度上是在猜测,因为官方文档没有说,但我对泛型的派生类为什么需要泛型的解释是:泛型类的大小可以不同——也就是说,class
A{let t:t}
的大小会有所不同,这取决于T是
Int
(大小为8)还是
字符串(大小为24)。派生类的大小也可能不同,因为它的基类可以是泛型的,因此要说明这一点,需要是泛型的。如果您的
派生的
类将其基类指定为
Int
,那么您可能会选择常规协议,而不是具有关联类型的协议,这样你就可以把基础重构成一个协议?我回去看看我是否可以再次使用一个基于协议的版本。。。闭包可能是一种方法。谢谢你的回复。提交给苹果的错误报告:)
class Container {
  let item: Base<Int>
  init(item:Base<Int>) {
    self.item = item
  }
  func method(input:Int) -> Int {
    return item.method(input)
  }    
}
let a = Derived<Int>()
let b = Container(item:a)
let test = b.method(42)
let d: Base = Derived<Int>()
d.method(2)
protocol P {
    // instead of T, best to call it
    // something with a meaningful name...
    typealias T

    func method(input: Int) -> T
}

class D : P {
    typealias T = Int

    func method(input: Int) -> Int {
        return input * 2
    }
}

class Container<U: P> {
    let item:  U
    init(item: U) {
        self.item = item
    }
    func method(input: Int) -> U.T {
        return item.method(input)
    }
}

let d = D()
let c = Container(item: d)
c.method(2)