大佬教程收集整理的这篇文章主要介绍了泛型 – Swift通用虚方法调用导致段错误,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在下面的代码中,您将看到Derived类继承自泛型类Base< T>:
class Base<T> { func method(@R_675_10185@ -> T { fatalError("Subclasses must override method.") } } class Derived<T> : Base<Int> { override func method(input:@R_675_10185@ -> Int { return input } }
在Swift 1.1中,非泛型类不可能从泛型类继承.因此,在这种情况下,Derived有一个虚拟类型变量.
如果我现在使用这些类:
class Container { let item: Base<Int> init(item:Base<Int>) { self.item = item } func method(input:@R_675_10185@ -> 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: @R_675_10185@ -> T } class D : P { typealias T = Int func method(input: @R_675_10185@ -> Int { return input * 2 } } class Container<U: P> { let item: U init(item: U) { self.item = item } func method(input: @R_675_10185@ -> U.T { return item.method(input) } } let d = D() let c = Container(item: d) c.method(2)
以上是大佬教程为你收集整理的泛型 – Swift通用虚方法调用导致段错误全部内容,希望文章能够帮你解决泛型 – Swift通用虚方法调用导致段错误所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。