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

Generics 使用泛型时遇到编译器错误,generics,compiler-errors,swift,xcode6,Generics,Compiler Errors,Swift,Xcode6,在尝试处理一个小型Swift项目时,我经常遇到以下编译器错误: var item : T? ^ LLVM ERROR: unimplemented IRGen feature! non-fixed class layout 产生这种错误的代码非常简单: class Foo<T> { var item : T? } 给予 0 swift 0x000000011075a608 llvm::sys::PrintStackTrace(u sFILE*)+40 1 swift

在尝试处理一个小型Swift项目时,我经常遇到以下编译器错误:

var item : T?
    ^
LLVM ERROR: unimplemented IRGen feature! non-fixed class layout
产生这种错误的代码非常简单:

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

0 swift 0x000000011075a608 llvm::sys::PrintStackTrace(u sFILE*)+40
1 swift 0x000000011075aaf4信号处理器(内部)+452
2 libsystem_platform.dylib 0x00007fff901095aa_sigtramp+26
3 libsystem_platform.dylib 0x0000000111b5ba00_sigtramp+2175083632
4 swift 0x000000011054A67 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::visit(swift::CanType)+124
7 swift 0x000000010fb58395 swift::irgen::IRGenFunction::emitTypeMetadataRef(swift::CanType)+21
8 swift 0x000000010fb9b7e9 swift::irgen::WitnessSizedTypeInfo::allocateStack(swift::irgen::irgen Function&,swift::CanType,llvm::Twine const&)const+89
9 swift 0x000000010fbc81a2 swift::SILVisitor::visit(swift::ValueBase*)+34626
10 swift 0x000000010fbbf266 swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*)+8678
11 swift 0x000000010fb406f8 swift::irgen::IRGenModule::EmitGlobalToLevel()+184
12 swift 0x000000010fbac6e3性能生成(swift::IRGenOptions&,swift::Module*,swift::SILModule*,llvm::StringRef,llvm::LLVMContext&,swift::SourceFile*,unsigned int)+1859
13 swift 0x000000010fbad033 swift::性能生成(swift::IRGenOptions&,swift::SourceFile&,swift::SILModule*,llvm::StringRef,llvm::LLVMContext&,unsigned int)+51
14 swift 0x000000010fb1f65a前端_main(llvm::ArrayRef,char const*,void*)+4842
15 swift 0x000000010fb1e35d干管+1533
16 libdyld.dylib 0x00007fff8b2d05fd启动+1
17 libdyld.dylib 0x0000000000000040开始+1959983684
而将
struct OptionalWrapper
更改为
struct OptionalWrapper
甚至会使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()
类小部件
{
var值:T?
初始值(值:T?)
{
自我价值=价值
}
func description()->字符串
{
设valueType=value?self
return“Widget是\(valueType?.className)”
}
}
让stringWidget=Widget(值:“Hello”)
让numericWidget=Widget(值:9001)
让doubleWidget=Widget(值:3.14159)
let arrayWidget=Widget(值:[0xFEED,0xBEEF,0xCAFE])
stringWidget.description()
numericWidget.description()
doubleWidget.description()
arrayWidget.description()
这就是说,我相信游乐场和编译器有很多bug,包括您正在经历的行为


我也无法通过创建
小部件(value:Widget(value:x))
来实现“WidgetException”,我更喜欢约束
:AnyObject
(无需导入),但B必须引用类

// import Foundation

class A <B: AnyObject> { let it: B; init(_ b: B) { it = b } }

class C { let DCI = 601 }

println( A(C()).it.DCI ) // 601
<代码> /导入基础 类A{let it:B;init(B:B){it=B} 类C{let DCI=601} println(A(C()).it.DCI)//601
对meAlso来说就像一个bug,将
class Foo
更改为
class Foo
阻止了操场对我的冲击,并允许我用
NSString
构造泛型,我们现在是Swift 3.0,我很抱歉地报告泛型仍然处于令人震惊的状态;幸运的是,如果您收到编译器不喜欢的错误消息,大多数情况下,它只是SEGFULT 11。糟糕。好吧,让我们看看在2014年秋季Swift真正上架之前是否会有工具链更新。这使得我现在很难设计我的代码,因为我必须解决语言参考中不同描述的困难:oSo我们确定苹果是否会很快修复这些编译器错误吗?他们阻碍了我的开发:/这看起来确实比使用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()
// import Foundation

class A <B: AnyObject> { let it: B; init(_ b: B) { it = b } }

class C { let DCI = 601 }

println( A(C()).it.DCI ) // 601