在尝试处理小型
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’.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。