泛型 – Swift通用虚方法调用导致段错误

泛型 – Swift通用虚方法调用导致段错误,第1张

概述我是 Swift的新手,所以我可能会做一些愚蠢的事情.如果是这样,很好:请告诉我在哪里! 在下面的代码中,您将看到Derived类继承自泛型类Base< T>: class Base<T> { func method(Int) -> T { fatalError("Subclasses must override method.") }}class Derived<T> : 我是 Swift的新手,所以我可能会做一些愚蠢的事情.如果是这样,很好:请告诉我在哪里!

在下面的代码中,您将看到Derived类继承自泛型类Base< T>:

class Base<T> {  func method(Int) -> T {    fatalError("Subclasses must overrIDe method.")  }}class Derived<T> : Base<Int> {  overrIDe func method(input:Int) -> Int {    return input  }}

在Swift 1.1中,非泛型类不可能从泛型类继承.因此,在这种情况下,Derived有一个虚拟类型变量.

如果我现在使用这些类:

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)

代码编译得很好,但是当调用Derived< Int> .method时我得到一个段错误.根据我到目前为止的调试,看起来自我指针在Container.method中是正确的,但是一旦我们进入Derived< Int> .method就错了.也许有一些堆栈腐败正在进行?

对此代码的各种细微更改会使其正常工作(尽管语义不同).谁能解释一下这里发生了什么?在我对Swift了解更多之前,我对于建议编译器错误犹豫不决.

解决方法 你肯定在编译器或运行时发现了一个错误 – 应该不可能得到像这样的段错误编写代码.它应该运行正常,或者无法编译.你甚至不需要容器类,你可以重现错误

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

但是,即使它是运行时中的一个错误,我也会说这可能不是一个好习惯.使派生类具有通用性的要求是有原因的,并且使用虚拟模板来捏造它可能不是一个好主意.例如,声明让d:Base = Derived< String>()是什么意思?

如果Base没有实际的实现并且只是抽象的(或者即使它确实存在,并且您可以将它们排除在外),您可能最好用协议替换基础,也许使用关联类型来表示T:

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)

这种方法的另一个好处是允许D成为一个值类型(即结构),如果你想要它,因为它们不能继承,但它们可以.

总结

以上是内存溢出为你收集整理的泛型 – Swift通用虚方法调用导致段错误全部内容,希望文章能够帮你解决泛型 – Swift通用虚方法调用导致段错误所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/999799.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存