在Swift中使用协议作为泛型类型转换为类

时间:2015-05-26 11:28:33

标签: swift generics

我有几个类都符合名为DataObject的协议。我有另一个类,它接收一个也符合DataObject的泛型类型,例如:

protocol DataObject {
    func foo()
    //...
}

class A : DataObject {
    //...
}

class B : DataObject {
    //...
}

class C : DataObject {
    //...
}

class SomeClass<T: DataObject> {
    //...
}

稍后在我的代码中,我有一个AnyObject类型的对象,我需要转换为SomeClass。我不知道SomeClass中对象的具体类型(并且不在乎)。但是,每当我这样做时:

var someClass = obj as? SomeClass<DataObject>

编译器给出了编译过程中似乎崩溃的错误 - &#34;命令由于信号而失败:分段错误:11&#34;。

在错误细节中间的某处,有一个崩溃的调用堆栈:

0  swift                    0x000000010fecb2b8 llvm::sys::PrintStackTrace(__sFILE*) + 40
1  swift                    0x000000010fecb794 SignalHandler(int) + 452
2  libsystem_platform.dylib 0x00007fff87563f1a _sigtramp + 26
3  swift                    0x00000001112b0637 llvm::DenseMapAPIntKeyInfo::getHashValue(llvm::DenseMapAPIntKeyInfo::KeyTy const&) + 151
4  swift                    0x000000010f84db39 swift::irgen::emitWitnessTableRefs(swift::irgen::IRGenFunction&, swift::Substitution const&, llvm::SmallVectorImpl<llvm::Value*>&) + 329
5  swift                    0x000000010f8280be emitNominalMetadataRef(swift::irgen::IRGenFunction&, swift::NominalTypeDecl*, swift::CanType) + 1310
6  swift                    0x000000010f81a3d4 getTypeMetadataAccessFunction(swift::irgen::IRGenModule&, swift::CanType, swift::ForDefinition_t) + 580
7  swift                    0x000000010f813526 swift::irgen::IRGenFunction::emitTypeMetadataRef(swift::CanType) + 54
8  swift                    0x000000010f7dca9f swift::irgen::emitClassDowncast(swift::irgen::IRGenFunction&, llvm::Value*, swift::SILType, swift::irgen::CheckedCastMode) + 143
9  swift                    0x000000010f89ac89 emitValueCheckedCast((anonymous namespace)::IRGenSILFunction&, swift::SILValue, swift::SILType, swift::irgen::CheckedCastMode, swift::irgen::Explosion&) + 1065
10 swift                    0x000000010f894bfa swift::SILVisitor<(anonymous namespace)::IRGenSILFunction, void>::visit(swift::ValueBase*) + 23626
11 swift                    0x000000010f88e39d swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 9901
12 swift                    0x000000010f7f8f4f swift::irgen::IRGenModule::emitGlobalTopLevel() + 159
13 swift                    0x000000010f878c59 performIRGeneration(swift::IRGenOptions&, swift::Module*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 2121
14 swift                    0x000000010f879693 swift::performIRGeneration(swift::IRGenOptions&, swift::SourceFile&, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, unsigned int) + 51
15 swift                    0x000000010f7b5087 frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 6647
16 swift                    0x000000010f7b34e6 main + 1814
17 libdyld.dylib            0x00007fff8db4d5c9 start + 1

我真的陷入困境,因为我不能按照我应该的方式使用这个对象...为什么会发生这种情况或者更好的解决方法?

0 个答案:

没有答案