加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用泛型时遇到编译器错误

发布时间:2020-12-14 02:24:45 所属栏目:百科 来源:网络整理
导读:在尝试处理小型 Swift项目时,我经常遇到以下编译器错误: var item : T? ^LLVM ERROR: unimplemented IRGen feature! non-fixed class layout 产生这种错误的代码非常简单: class FooT { var item : T?} 有趣的是,如果你从一个类改为一个struct,那么一切都
在尝试处理小型 Swift项目时,我经常遇到以下编译器错误:
var item : T?
    ^
LLVM ERROR: unimplemented IRGen feature! non-fixed class layout

产生这种错误的代码非常简单:

class Foo<T> {
  var item : T?
}

有趣的是,如果你从一个类改为一个struct,那么一切都很好.

任何人都可以验证这一点,所以我可以回过头来指责一个尚未完成的编译器而不是我编译器工具链中的一些奇怪的混音?

更新:

尝试使用以下替代实现智能明显错误的编译器会导致更加搞笑的编译器错误.例如以下内容

class Foo<T> {
    // Let's try with an inner struct
    struct OptionalWrapper {
        var item: T?
    }
    var item : OptionalWrapper
    init(item: T?) { self.item = OptionalWrapper(item: item) }
}

0  swift                    0x000000011075a608 llvm::sys::PrintStackTrace(__sFILE*) + 40
1  swift                    0x000000011075aaf4 SignalHandler(int) + 452
2  libsystem_platform.dylib 0x00007fff901095aa _sigtramp + 26
3  libsystem_platform.dylib 0x0000000111b5ba00 _sigtramp + 2175083632
4  swift                    0x0000000110a54a67 swift::BoundGenericType::getSubstitutions(swift::Module*,swift::LazyResolver*) + 55
5  swift                    0x000000010fb696a9 emitNominalMetadataRef(swift::irgen::IRGenFunction&,swift::NominalTypeDecl*,swift::CanType) + 537
6  swift                    0x000000010fb5841c llvm::Value* swift::CanTypeVisitor<(anonymous namespace)::EmitTypeMetadataRef,llvm::Value*>::visit<>(swift::CanType) + 124
7  swift                    0x000000010fb58395 swift::irgen::IRGenFunction::emitTypeMetadataRef(swift::CanType) + 21
8  swift                    0x000000010fb9b7e9 swift::irgen::WitnessSizedTypeInfo<(anonymous namespace)::NonFixedStructTypeInfo>::allocateStack(swift::irgen::IRGenFunction&,swift::CanType,llvm::Twine const&) const + 89
9  swift                    0x000000010fbc81a2 swift::SILVisitor<(anonymous namespace)::IRGenSILFunction,void>::visit(swift::ValueBase*) + 34626
10 swift                    0x000000010fbbf266 swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 8678
11 swift                    0x000000010fb406f8 swift::irgen::IRGenModule::emitGlobalTopLevel() + 184
12 swift                    0x000000010fbac6e3 performIRGeneration(swift::IRGenOptions&,swift::Module*,swift::SILModule*,llvm::StringRef,llvm::LLVMContext&,swift::SourceFile*,unsigned int) + 1859
13 swift                    0x000000010fbad033 swift::performIRGeneration(swift::IRGenOptions&,swift::SourceFile&,unsigned int) + 51
14 swift                    0x000000010fb1f65a frontend_main(llvm::ArrayRef<char const*>,char const*,void*) + 4842
15 swift                    0x000000010fb1e35d main + 1533
16 libdyld.dylib            0x00007fff8b2d05fd start + 1
17 libdyld.dylib            0x0000000000000040 start + 1959983684

并将struct OptionalWrapper更改为struct OptionalWrapper< T>甚至使swift编译器看起来陷入无限循环(你仍然可以使用XCode中的停止按钮取消它).

所以我目前的建议是:暂时不要使用类中的Swift泛型,这似乎是非常不稳定的地形……

我能够通过向T添加NSObject约束来让它停止崩溃并实际工作:
class Widget<T:NSObject>
{
    var value : T?

    init(value:T?)
    {
        self.value = value
    }

    func description() -> String
    {
        let valueType = value?.self

        return "Widget is a (valueType?.className)"
    }
}

let stringWidget = Widget(value:"Hello")
let numericWidget = Widget(value:9001)
let doubleWidget = Widget(value:3.14159)
let arrayWidget = Widget(value:[0xFEED,0xBEEF,0xCAFE])

stringWidget.description()
numericWidget.description()
doubleWidget.description()
arrayWidget.description()

也就是说,我确实认为游乐场和编译器有很多错误,包括你遇到的行为.

我也无法通过创建Widget(值:Widget(value:x))来制作’widgetception’.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读